[解]
这是一个典型的二化十汇编语言题例,其算法是将被转换的二进制数依次被 10i(i为 4、3、2、1、0)除,所得的商即为该十进制数位的值,其余数再被下一个 10i 除。一般用减法代替除法,即一边减10i,一边计数器加 1,直到不够减再进行下一位 10i-1。
1)寄存器分配:GR0:被转换数;GR2:存放五位十进整数数字字符的起始地址。
GR1:数位计数器(兼作SNO内存数组的下标)
GR3:在初始化时放空格的ASCII码(48),在转换时作某一位的数码计数器(初始值为 0 的 ASCII 码 48)
2)SNO 内存变量依次存放 104、103、102、101、100 。
3)第 2~9 行为初始化程序,在 GR0<10i 时,对应的十进整数数字字符单元放空格(当结果小于五位时,左边用空白符替换),此过程一直进行到 GR0≥10i 或 GR1= 4(个位)。因此____(1)____应为 "CPL GR0,SNO,GR1"。
4)L2 开始进行除法(减法)。GR3 作某一位的数码计数器。从 L4 可看出,该计数值直接放到结果单元 [GR2],而按题意所放的是 ASCII 码,所以其初始值应为 0 的 ASCII 码 48。因此___(2)___为:
LEA GR3,48
5)根据算法,GR0≥10i 才做减法,故____(3)____还是 "CPL GR0,SNO,GR1"。
6) ___(4)___是 "JMP L3",即继续做这一位的减法,直至 GR0<10i。
7)L4 后 3 行是某一位结束处理:结果送到地址指针 GR2 所指的存放单元;地址指针 GR2 加 1;SNO 内存数组的下标 GR1 加 1。
8)___(5)___应该是判断除法是否做到个位结束。即下标 GR1=5,因此这一句为:
LEA GR3,-5,GR1
6、1996年试题四
[程序说明]
子程序 OFFSET 用二分法,查找无符号整数 M 在一个长度为 N 的有序(升序)无符号整数列表NTABLE 中的位置。程序中标号为 LOW 和 UP 的两个存储字分别用作存放查找空间的上下限。
进入子程序时,在 GR1 中中给出存放子程序所需参数的起始地址。参数的存放次序如下图:
(GR1)+0 | M |
1 | N |
2 | NTABLE的首址 |
从子程序返回时,GR0 中存放查找结果,即 M 在此有序表中的位置序数,如表中找不到 M,则 GR0 中返回 0,其它寄存器的内容保持不变。
[程序]
START | 1 | |||
OFFSET | PUSH | 0,GR2 | 2 | |
PUSH | 0,GR3 | 3 | ||
LD | GR0,0,GR1 | 4 | ||
LEA | GR2,0 | 5 | ||
ST | GR2,LOW | 6 | ||
___(1)___ | 7 | |||
___(2)___ | 8 | |||
ST | GR2,UP | 9 | ||
LOOP | ADD | GR2,LOW | 10 | |
SRL | GR2,1 | 11 | ||
LEA | GR3,0,GR2 | 12 | ||
___(3)___ | 13 | |||
___(4)___ | 14 | |||
JZE | FOUND | 15 | ||
JPZ | INCLOW | 16 | ||
LEA | GR2,-1,GR2 | ;M<NTABLE(K) | 17 | |
ST | GR2,UP | 18 | ||
JMP | CMPLU | 19 | ||
INCLOW | LEA | GR2,1,GR2 | ;M> NTABLE(K) | 20 |
ST | GR2,LOW | ;K+1→LOW | 21 | |
___(5)___ | 22 | |||
CMPLU | CPL | GR2,LOW | 23 | |
___(6)___ | 24 | |||
___(7)___ | 25 | |||
FOUND | LEA | GR0,1,GR2 | 26 | |
POP | GR3 | 27 | ||
POP | GR2 | 28 | ||
RET | 29 | |||
LOW | DS | 1 | 30 | |
UP | DS | 1 | 31 | |
END | 32 |
[