CASL题,请教高手

bankgirl1110 2003-09-23 03:59:49
子程序MOVE是将地址为A开始的N个存储单元移动到地址为B开始的N个存储单元中,对于两个区域互相重叠的情况也能正确处理。
主程序在GR1中给出存放子程序所需参数的起始地址。参数的存放形式为:
┌──────┐
(GR1)+0 │ A │
├──────┤
+1 │ B │
├──────┤
+2 │ N │
└──────┘
●程序
1 MOVE START
2 LD GR2,1,GR1
3 LD GR3,0,GR1
4 CPL GR3,1,GR1
5 JZE ENDMOV
6 _____(1)_____
7 _____(2)_____
8 JMP SAVE
9 LT _____(3)_____
10 LEA GR3,____(4)____
11 _____(5)_____
12 LEA GR2,____(6)____
13 _____(7)_____
14 SAVE ST GR0,WORK
15 LD GR1,2,GR1
16 LOOP LD GR0,0,GR3
17 ST GR0,0,GR2
18 ADD GR2,WORK
19 ADD GR3,WORK
20 LEA GR1,-1,GR1
21 JNZ LOOP
22 ENDMOV RET
23 WORK DS 1
24 END
答案是(1) JMI LT (2) LEA GR0,1
(3) ADD GR3,2,GR1 (4) -1,GR3
(5) ADD GR2,2,GR1 (6) -1,GR2
(7) LEA GR0,-1或LEA GR0,65535
答案是如何得出的?能否详细说明?多谢!
...全文
33 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
commandconque 2003-09-23
  • 打赏
  • 举报
回复
楼上说的很清楚了,我来晚了。
应该是把B对应的数据区域放到A对应的区域中吧!

GR0:移动数据的 递增/递减量 --WORK
GR1:存放数据区长度的地址
GR2: 数据源存放地址 (B)------LD GR2,1,GR1
GR3:数据终存放地址(A)-----LD GR3,0,GR1

pebble 2003-09-23
  • 打赏
  • 举报
回复
在分析的时候,要注意题目里提到的"对于两个区域互相重叠的情况也能正确处理"
一开始直接看上面的那些空,得不到什么线索,可以先看看后面的
首先:loop开始的一段程序,很容易看出是在循环将A的内容移动到B,
在这段程序中,容易看出,GR3存放A的地址,GR2存放B的地址,GR1存放长度,控制循环
ADD GR2,WORK
ADD GR3,WORK
应该是每次循环,修改A B 位置,这里WORK存放应该每次循环的增量,
然后看SAVE标号开始的两句,第一句把GR0的值付给WORK,所以GR0上面的空里肯定需要被赋值
第二句,就是把长度赋给GR1
对已知线索差不多分析完了,回到上头,
看(1) (2) 两空结束后直接就jmp SAVE
那么(1) (2)两空其中必须要给GR1赋一个合适的值
这时再回到题意,"对于两个区域互相重叠的情况也能正确处理",A和B重叠的时候,实际还要分两种情况,
1。A的起址 > B的起址
这时候移动的时候,只能从头开始,就是先[A]->[B] ,然后[A+1] -> [B+1] 然后[A+2] -> [B+2]……
2. A的起址 < B的起址
这时候移动的话,只能从尾,就是先[A+N-1] -> [B+N-1],然后[A+N-2] -> [B+N-2],然后[A+N-3] -> [B+N-3] …………

否则就会出现覆盖未移动区域的情况,这个你可以自己画图试试
明白了上面的这两个情况,那么这些空就好理解了
那么(1)(2)两空已经有一句肯定是给GR0赋值,另一句就要判断A的起址 B的起址的关系
如果A的起址 < B的起址,则要把增量变成-1,起始位置从后面开始
(1)上面已经进行了cpl比较,那么(1)就是JMI LT,如果A的起址 < B的起址则转移到LT,进行处理,
那么(2)就自然是给增量赋值,LEA GR0, 1
LT下面的空就开始处理A的起址 < B的起址的问题,先考虑主要要解决的工作:
A+N-1 -> GR3
B+N-1 -> GR2
-1 -> GR0
那么这些空也就很快解决了
wangmin_yjitx 2003-09-23
  • 打赏
  • 举报
回复
搞清楚上面这个问题,其他的就好理解了。
wangmin_yjitx 2003-09-23
  • 打赏
  • 举报
回复
这里要注意的一个问题是A的地址大还是B的地址大,如果是A的地址大,则顺序传送。如果A的地址大,则为了不被覆盖部分数据,所以要从尾部开始逆序传送。
LT是处理B地址大的部分(也就是要从尾部开始),这里GR0作为循环计数器,如果是顺序传送,GR0为1,如果是逆序传送,GR0为-1。
commandconque 2003-09-23
  • 打赏
  • 举报
回复
Thinking...

2,959

社区成员

发帖
与我相关
我的任务
社区描述
就计算机等级考试、软件初、中、高级不同级别资格考试相关话题交流经验,共享资源。
c1认证c4javac4前端 技术论坛(原bbs)
社区管理员
  • 软件水平考试社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧