B
[程序4.2]
START
SUM
LD
GR2,0,GR1
LD
GR3,1,GR1
LEA
GR0,0
L5
ADD
GR0,0,GR2
LEA
GR2,1,GR2
_ (4) _
JNZ
L5
L3
__(5)
ST
GR0,0,GR3
RET
END
[分析]
1)GR1 为参数表起始地址
2)GR2 为数组地址指针,起始值为A
3)GR3 为计数器,初始值为数组长度 n。
4)GR0 为累加和工作单元
5)( (4) )应该是计数器减
1:LEA GR3,-1,GR3
6)( (5) )应把结果单元地址
B 赋给 GR3:LD GR3,2,GR1
4、1998年试题四
[程序说明]
本程序是统计字符串中数字字符"0"至"9"的出现次数。
字符串中的每个字符是用ASCII码存贮。一个存贮单元存放两个字符,每个字符占8位二进位。
程序中,被统计的字符串从左至右存放在STR开始的连续单元中,并假定其长度不超过200,字符串以'·'符作为结束。NCH开始的10个单元存放统计结果。
START
MIN
1
MIN
LEA
GR2,9
2
LEA
GR0,0
3
L1
_ (1) _
4
LEA
GR2,-1,GR2
5
JPZ
L1
6
LEA
GR4,0
7
LEA
GR1,0
8
L2
LD
GR2,STR,GR1
9
EOR
GR4,C1
10
JNZ
RL
11
_ (2) _
12
RL
SR
GR2,8
13
LEA
GR3,0,GR2
14
SUB
GR3,C9
15
JNZ
L4
16
L3
LEA
GR3,0,GR2
17
SUB
GR3,CO
18
JM1
L5
19
LEA
GR2,1
20
_(3)_
21
_(4)_
22
L4
LEA
GR4,0,GR4
23
JNZ
L2
24
_(5)_
25
JMP
L2
26
L5
SUB
GR2,C
27
JNZ
L4
28
EXIT
29
C1
DC
1
30
C
DC
'·'
31
C0
DC
'0'
32
C9
DC
'9'
33
STR
DS
200
34
NCH
DS
10
35
END
36
[解]
1)第2~8行(L2以前)是初始化程序,其中第2~6行是把计数器存放单元NCH开始的十个单元清零。地址指针是GR2(递减),故((1))为:ST GR0,NCH,GR2
2)从第 8、9 行看出 GR1 是地址指针(相对于 STR)。GR2是工作单元(要处理的字符)
3)因一个字放两个字符,故GR3用作高低字节标志。起始值为0,先处理高字节,第10行指令"EOR GR4,C1"一方面判断是否第一次(结果非0),并将GR4置1。
第一次处理高字节,用逻辑右移指令将高8位内容移到低8位(高8位置0)。
第二次处理低字节,用先逻辑左移再逻辑右移指令将高8位内容置0,故(2)为:
SLL GR2,8
4)在处理过程又用 GR3 作临时工作单元,即把GR2内容送给GR3再处理。处理时先判是否>"9"(不计数)。然后减以
"0" ,使 GR3 变成 0~9。
5)计数处理是在第 21、22、23 三行中完成。使 NCH 开始的 10 个单元中与
GR3 对应的那个单元加1。因加法指令的目的操作数只能是寄存器,所以先给
GR2 送 1(第 21 行),再将 NCH 对应单元内容加到GR2 中,再将 GR2
内容送回 NCH 对应单元(采用 GR3 变址寻址)。故 (3)
及 (4) 为:"ADD
GR2,NCH,GR3"及"ST GR2,NCH,GR3"。
6)在一个字的第二次处理后(用第 24、25 行判断),要修改字符串的地址指针
GR1(加1)。故 (5) 为:"LEA GR1,1,GR1"。
5、1997年试题四
[程序说明]
本子程序将一个非负二进整数翻译成五位十进整数字符。
进入子程序时,在 GR0 中给出被翻译的非负二进整数,在 GR2 中给出存放五位十进整数数字字符的起始地址。
十进制数字字符用 ASCII 码表示。当结果小于五位时,左边用空白符替换;当二进整数为零时,在(GR2)+4
中存放 0 的 ASCII 码。
数字字符 0 至 9 的 ASCII 码是 48 至 57,空白符的 ASCII 码是 32。
[程序]
START
1
LEA
GR1,0
2
LEA
GR3,32
3
L1
____(1)____
4
JPZ
L2
5
ST
GR3,0,GR2
6
LEA
GR2,1,GR2
7
LEA
GR1,1,GR1
8
LEA
GR4,-4,GR1
9
JNZ
L1
10
L2
___(2)___
11
L3
___(3)___
12
JMI
L4
13
SUB
GR0,SNO,GR1
14
LEA
GR3,1,GR3
15
___(4)___
16
L4
ST
GR3,0,GR2
17
LEA
GR2,1,GR2
18
LEA
GR1,1,GR1
19
___(5)___
20
JNZ
L2
21
RET
22
SNO
DC
10000
23
DC
1000
24
DC
100
25
DC
10
26
DC
1
27
END
28
[解]
这是一个典型的二化十汇编语言题例,其算法是将被转换的二进制数依次被
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
[解]
二分法查找的基本思想是对任意一段查找空间 [LOW,UP](有序)中的的表元,试探位置
K=(LOW+UP)/2上的成分 NTABLE(K) 与 M 进行比较,其可能结果有三种:
1)NTABLE(K)= M,找到,结束查找。
2)NTABLE(K)< M,下一查找空间为[K+1,UP]。
3)NTABLE(K)> M,下一查找空间为[LOW,K-1]。
初始查找空间为 LOW=0,UP=N-1。
程序中空格___(1)___和___(2)___前面的两条指令是将查找空间的上限
LOW 中 0,二在它之后的指令是将 GR2 中的值存于查找空间的下限
UP 中。因此这两个空格是把下限初值 N-1 送给 GR2。由于进入子程序时,N
存放在(GR1)+1 中,所以这两条指令为:
LD GR2,1,GR1
LEA GR2,-1,GR2
从标号 LOOP 开始的循环是求试探位置 K,根据 NTABLE(K) 和 M
比较结果,分别处理三种不同的情况,直至查到或查找空间为
0 。
考察空格___(3)___和___(4)___前面的指令,可得 K 在 GR2 和 GR3 中,在执行___(3)___和___(4)___两条指令后,有三种转向,因此这两条指令是将
GR0 中的 M 与 NTABLE(K)比较。而从程序说明中以知,NTABLE(0) 地址在
GR1+2。故 NTABLE(K) 的地址应为 GR2 或 GR3 与(GR1+2)相加(绝对地址)。但GR2
在后面要作相对地址 K用,所以只能是 GR3 与(GR1+2)相加。所以空格___(3)___和___(4)___为:
ADD GR3,2,GR1
CPL GR0,0,GR3
执行上述两条指令后,若不相等则要调整查找空间,在继续查找前,先应判断查找空间是否为
0,在程序中是用标号为 CMPLU 的指令实现,显然 GR2 内应是查找空间的下限
UP。故___(5)___的答案为:
LD
GR2,UP
当查找空间不为0时(UP>LOW),应继续查找,所以___(6)___的解答为:
JPZ LOOP
子程序返回时,GR0 中存放查找结果,在表中找到M时,GR0 中存放M在表中的位置序数,在程序中用
"FOUND LEA GR0,1,GR2" 实现(这里 GR2 中是试探位置,与位置序数差
1 )。
若表中找不到 M,GR0 中要放 0,所以___(7)___处应填 "LD GR2,-1"。