[程序] START PRUGBC LD GR0,DATA LEA GR1,0 LEA GR3,48 LOOP1

admin2005-03-15  40

问题 [程序]
              START
   PRUGBC     LD       GR0,DATA
              LEA      GR1,0
              LEA      GR3,48
   LOOP1      CPL      GR0,WDT,GR1
              JP2      LOOP2
              ST       GR3,BTASC,GR1
              LEA      GR1,1,GR1
              LEA      GR2,-4,GR1
              JN2      LOOP1
                   (1)      
   LOOP2      LEA      GR2,48
   LOOP3      CPL      GR0,WDT,GR1
              JMI      NEXT
                   (2)         
              LEA      GR2,1,GR2
              JMP      LOOP3
   NEXT            (3)      
              LEA      GR1,1,GR1
              LEA      GR2,-4,GR1
             JNZ       LOOP2
   LAST            (4)      ;处理个位数
                   (5)      
             EXIT
   C48       DC        48
   WDT       DC        10000
    DC    1000
   DC    100
   DC    10
   BTASC    DS    5
   DATA    DC    #FA59H
   END

选项

答案(1)JMP LAST (2)SUB GR0,WDT,GR1 (3)ST GR2,BTASC,GR1 (4)ADD GR0,C48 (5)ST GR0,BTASC,GR1

解析 本程序是将16位无符号二进制数转换为5位十进制数。
   程序的前3句是对寄存器赋初值,DATA数据(即要转换的数)被读取到GR0,GR1置为0,GR3置为48。第四句是一个逻辑比较语句(从这个语句可以看出,GR1用作 WDT的偏移地址),比较GR0和WDT中的数据的大小。
   WDT开始的5个连续空间的数据分别为“10000,1000,100,10,5”。因为当前的 GR1为0,所以WDT对应的为“10000”,当GR0大于等于(WDT)时转LOOP2,小于 (WDT)则继续往下执行。其实在这种情况下,最好的分析方法就是把DATA中的数据自己手动转成十进制,然后把数据代到程序里,跟踪程序的执行,这样能最快的了解程序的执行流程和处理方法,同时也做了验证工作。
   因为#FA59H转成十进制是64089。所以现在程序转到LOOP2执行。GR2置48,单从这里无法了解GR2是什么用途。比较GR0与(WDT+GR1)的大小,GR0比10000大,所以执行(2),再执行“LEAGR2,1,GR2”即把GR2自加1(结合题目提到的“转换结果用ASCH码表示”,可以了解到GR2的用途,因为48正好是ASCII码的“0”,自加就变成“1”了,所以GR2是统计GR0中(WDT+GR1)的个数并把它转化为ASCII码形式)。
   然后再转向LOOP3执行,这样又回到了前面比较。在已知的语句中并没有对GR0, GR1进行变动,所以(2)中一定是对这2个寄存器值的改变,不然这段循环就成了死循环了。结合“LEAGR2,1,GR2”的功能,可知(2)应是对GR0自减一个(WDT+GR1),即 SUB GR0,WDT,GR1。
   程序分析到这里,可以了解到NEXT标号后的语句是为下一步的统计做准备,即首先保存上一步已统计的“10000”的个数,再为统计“1000”的个数,为寄存器置初始值,程序已有“LEA GR1,1,GR1”,它能使WDT+GR”指向1000,所以(3)空要完成的功能是把“10000”的个数放到指定的位置,又因为题目中提到“转换结果用ASCII码表示,并从高位至低位依次存放在首地址为BTASC的连续5个内存单元中”,所以(3)空应填ST GR2,BTASC,GR1。
    接下来执行“LEAGR2,-4,GR1”GR1中存的是偏移量。当统计万位时,GR1为0;当统计千位时,GRl为1,要(GR1)-4为0,即GR1为4,应是统计个位数字。所以(4)和 (5)空是统计个位数字,其实这点在程序注释部分也有提及。
   那么如何利用已知数据,且用2步完成功能呢?这里注意到一个重要寄存器GR0。 GR0中现存的数就是个位数了,因为通过上面的几次循环,GR0中高位都被减掉了,所以现在只需把GR0加上一个48,然后再存入(BTASC+4)内存空间即可。其实把GR0加 48的方法很多,但是一定要注意一个问题,不能用LEA GR0,48,GR0,因为GR0寄存器是不能用变址寻址的。又因为程序中用到了C48,但一直没有语句用到过,所以用 ADD GR0,C48是最合适的。至此(5)空毫无疑问填ST GR0,BTASC,GR1。
   最后就剩(1)了。当万位为0时,就可以执行“JPZ LOOP2”后面的一段程序了,“ST GR3,BTASC,GR1”是把“0”存入BTASC+GR1位置。接下来的3条语句都已经很明显了,与程序的倒数第3,4,5条语句完成同样的功能,即判断是否已经处理到个位了,如果是,则直接转到LAST进行个位处理,所以(1)空应填JMP LAST。
转载请注明原文地址:https://jikaoti.com/ti/Eli7FFFM
0

相关试题推荐
最新回复(0)