工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 1015|回复: 0

汇编辅导--试题解释

[复制链接]
发表于 2003-9-7 10:43 | 显示全部楼层 |阅读模式
1、2002年试题四
[程序说明]

本程序将 80 个 ASCII 编码的数字字符转换成 BCD 码(二十进制码),并将每四个 BCD 码压缩在一个字中。见下面图示。

数字字符数据

地址
ASCII
 
+0
0033H
'3'

+1
0036H
'6'
+2
0038H
'8'
+3
0032H
'2'
...
...
 
压缩后的数据

地址 BCD码
YS 3682H
... ...


程序中约定原始数字字符存放在 SJ 开始的连续存区中,转换和压缩结果存放在 YS 开始的连续存区中。
[程序]

Y START  1
LEA GR1,0 2
__(1)__  3
S0 LEA GR3,4 4
S1 LD GR0,SJ,GR2 5
__(2)__  6
ST GR0,WK 7
__(3)__  8
OR GR4,WK 9
LEA GR3,-1,GR3 10
JNZ S2 11
ST GR4,YS,GR1 12
LEA GR1,1,GR1 13
__(4)__  14
S2 LEA GR2,1,GR2 15
CPL GR2,C80 16
__(5)__  17
WL EXIT  18
SJ DS 80 19
WK DS 1 20
CF DC #000F 21
C80 DC 80 22
YS DS 20 23  
END   

从程序说明中可知要将 80 个 ASCII 编码的数字字符转换成 BCD 码,并将每四个 BCD 码压缩在一个字中。必须有双重循环:内循环将每四个 BCD 码压缩在一个字中,外循环完成 80 个 ASCII 码转换(20个内循环)。从第4行LEA GR3,4可看出,GR3是内循环计数器,S1是内循环开始标号。

从第2行、第5行及第15行可知,GR2是源地址指针(在第2行赋初值),GR1是目的地址指针,应该在第3行赋初值。从而得到__(1)__空应为LEA GR2,0。

从第7行及第9行可知,第7~9行是将转换好的BCD码拼装到压缩字中。GR4是压缩字、WK是放转换好的 BCD 码的暂存单元。由此得__(2)__是将十进制数的ASCII码转换成BCD码,即AND GR0,CF。而将BCD码拼装到压缩字前,应该将压缩字中原来的BCD码左移4位,所以__(3)__空应为SLL GR4,4。

第10~17行应该是内外循环的控制语句,也是本程序的难点。

从第10、11行可看出,第15~17行应该内循环尚未结束的处理,但第16、17行却是判断外循环结束的语句。因此可知,此程序把内外循环的控制语句合在一起了。__(5)__空应是JNZ S1 或 JMI S1,注意,应该是跳转到内循环的起点S1,而不应该是S0。因为此处内循环尚未结束,不能给内循环计数器GR3重新赋值。

第12~14行应该是内循环结束的处理,即把拼装好的压缩字送回到目的地址(第12、13行)。但__(4)__空不应该是JMP S0,因为这样将会越过判断外循环结束的语句第16、17行。所以__(4)__空应该是非跳转语句,而从__(5)__(JNZ S1)看,内循环计数器GR3应重新赋值,所以__(4)__空应该是LEA GR3,4。

标号S0与WL是没用的。另外压缩字GR4也不需赋初值清0,因为4次移位,每次移4位,原来不管是什么数都移出到外面了。

2、2001年试题三

[程序说明]

子程序 DEHZ 用来对 HZ 编码的字串做解码处理。

HZ 编码是海外华人创造的一种将含有高位为 1 的汉字双字节字串转换成易于在网络中传输的ASCII 字符串的变换方式。编码过程中,被转换字符串中的原汉字子字符串各字节高位作清零处理,使之成为 ASCII 子字符串,并在其前后两端分别添加 ~{ 和 ~} 作为标记;而对于原 ASCII 子字符串,则将其中的 ~ 改写为 ~~,其余字符不变。

DEHZ 解码子程序则是 HZ 编码的复原过程。复原 ASCII 子字符串过程中遇有 ~~ 字符则改写为一个 ~ ,遇有 ~{ 则将其后直至 ~} 标记前的各字节高位置 1,复原为汉字子字符串,同时删除其前后标记。~的后续字符不属于以上情况均作为错误处理。

调用该子程序时, GR1 存放原始字符串首地址, GR2 存放还原后的目标字符串首地址。工作寄存器  GR3 用作处理汉字子字符串的识别标志,进入子程序时应初始化为处理 ASCII 子字符串。程序按照   CASL 语言的标准约定,字符串的每个字符只占用一个存储字的低八位。原始字符串和目标字符串均以 0 作为结束标志。

[程序]

START  1
DEHZ PUSH 0,GR3 2
PUSH 0,GR2 3
PUSH 0,GR1 4
LEA GR3,0 5
LOOP __(1)__  6
CPA  GR0,MARK0 7
JNZ GOON 8
LEA GR1,1,GR1 9
LD GR0,0,GR1 10
CPA GR0,MARK0 11
__(2)__  12
CPA GR0,MARK1,GR3 13
JNZ  ERROR 14
__(3)__  15
LEA GR1,1,GR1 16
JMP LOOP 17
ERROR OUT ERS1R,ERLEN 18
JMP EXIT 19
GOON __(4)__  20
ST GR0,0,GR2 21
LEA GR2,1,GR2 22
LEA GR1,1,GR1 23
CPA GR0,VO 24
__(5)__  25
EXIT P0P GR1 26
P0P GR2 27
P0P GR3 28
RET  29
V1 DC 1 30
V0  DC O 31
DC #0080 32
MARK0 DC  '~ ' 33
MARK1 DC '{ }' 34
ERSTR DC 'ERROR!' 35
ERLEN DC 6 36
END  37

[解]

寄存器作用:

GR1:源字符串地址指针,调用该子程序时,存放源字符串首地址。

GR2:目标字符串地址指针,调用该子程序时,存放目标字符串首地址。

GR3:用作处理汉字子字符串的识别标志。0 表示 ASCII 码(初始值),1 表示汉字。

GR0:工作寄存器,存放待处理的字符。(从第 7 行 "CPA  GR0,MARK0" 看出)

分析:

1)从第 7 行 " CPA  GR0,MARK0" 看出,GR0 中存放待处理的字符。所以第 6 行(__(1)__)必定是一条取数指令:"LD  GR0,0,GR1" ,即把源字符串地址指针所指的字符取到 GR0 中。

2)从第 7 行及第 8 行可知,第 9 行到第 17 行是处理碰到“~”的情况,即判断后一字符是否是“~”、“{ ”及“}”。若都不是,则出错。

3)从第 11 行可知,要判断是否连续两个“~”情况,而后面是继续比较,所以第 12 行(__(2)__)应该是一条“JZE”指令,而且是转移到 GOON ,即把“~”存放到目标字符串中。

4)第 13 行“CPA GR0,MARK1,GR3”应该是比较“{ ”及“}”:在中文状态比较“}”(结束),在西文状态比较“{ ”(开始)。所以这里用的是变址寻址,即由 GR3 的值是 0 或 1,决定是比较“{ ”还是“}”。

5)第 12 行(__(3)__)应该是改变汉字子字符串的识别标志 GR3 的指令,即原来是 0 的变成 1,原来是 1 的变成 0,异或指令可以达到此目的。将 GR3 与常数 1 相异或,因 Casl 没有没有立即数运算指令,只能和常数 V1 异或:EOR GR3,V1。

6)第 20 行(__(4)__)是 GR0 中存放的字符送到目标字符串前的处理工作:若是西文状态( GR3 的值是 0 ),保持原样;若是中文状态( GR3 的值是 1 ),字节最高位置 1,复原为汉字子字符串,将GR0 的内容与十六进制数 0080 相或,即能达到目的。所以这条指令应是:OR GR0,V0,GR3 。

7)第 24 行将 GR0 与 0 比较,是判断字符串结束标志 0 。若非 0(未结束),继续处理。故第 25 行(__(5)__)应是一条条件转移指令:JNZ LOOP 。

3、2000年试题四

[程序说明]

(1)本子程序根据每位职工的基本工资(非负值)和他完成产品的超额数或不足数计算该职工的应发工资。

(2)主程序调用时,GR1中给出子程序所需参数的起始地址,参数的存放次序如下表:

GR1
a1
  b1
  c1
  a2
  b2
  c2
  …
  an
  bn
  cn
  -1(结束标志)

其中 ai 为职工 i 的基本工资;bi 为职工 i 的完成产品的超额数或不足数;ci为职工 i 的应发工资数(i = 1、2、…、n)。

bi以原码形式存放(大于零为超额,小于零为不足),基本工资与计算所得的应发工资以补码形式存放。

(3)应发工资的计算规则为:

●恰好完成定额数(此时bi = 0),应发工资即为基本工资。

●每超额 4 件,在基本工资基础上增加 10 元(不到 4 件,以 4 计算,例如超额数为 10 时,增加 30 元)。

●每不足 4 件,在基本工资基础上减 5 元(不到 4 件,以 4 计算,例如不足数为 5 时,减 10元)。

[程序]

START  1
BEG  
PUSH 0,GR1 2
PUSH 0,GR2 3
PUSH 0,GR3 4
L1  __(1)__  5
LEA  GR0,0,GR2 6
JMI FINISH 7
LD GR3,1,GR1 8
LEA  GR2,0,GR3 9
AND GR2,C7FFF 10
JZE L3 11
SRL GR3,15 12
LEA GR2,-1,GR2 13
L2 __(2)__  14
LEA GR2,-4,GR2 15
JPZ L2 16
L3 __(3)__  17
__(4)__  18
__(5)__  19
FINISH POP GR3 20
POP GR2 21
POP GR1 22
RET  23
C7FFF DC #7FFF 24
BONUS DC 10 25
DC -5 26
END  27

[解]

寄存器作用:

GR1:地址指针

GR2:临时工作单元。先放 ai,后放 bi(绝对值)。

GR3:bi符号

GR0:ci---应发工资

分析:

1)从第 6 行 "LEA GR0,0,GR2" 及第 7 行 "JMI FINISH" 可知 GR0 开始时应是 ai,GR2 也应是ai,(从 LEA 指令功能分析)。所以第 5 行(1)应该是取数指令:

LD GR2,0,GR1

2)从第 8 行 "LD GR3,1,GR1" 及第 9 行 "LEA GR2,0,GR3" 可知 GR2 及 GR3 放的都是 bi(超额数或不足数),而从第 10 行 "AND GR2,C7FFF"(注意:C7FFF是 16 进制常量的标号(第 24 行)),可知 GR2 存放其绝对值。而且在该值为 0 时直接结束该职工处理(第 11 行 "JZE L3")。

3)从第 12 行 "SRL GR3,15" 可知 GR3 存放 bi 的符号(超额为 0,不足为 1)

4)从第 25、26 两行可知 BONUS 是每个超额或不足单位(4 件)的增加或扣除金额。从而得出最关键的第 14 行 (2) 应为 "ADD GR0,BONUS,GR3"。第 15、16 行指出这一加或减(GR3=1时,源操作数为负)是一循环过程,一直到 GR2<0。为防止 bi 为 4 的整数倍时多加减一次,在第 13 行中先将 GR 减 1。

5)第17、18、19行(L3)依次是该职工的应发工资回送、修改地址指针(指向下一职工)和跳到处理程序开始(L1):

ST GR0,2,GR1

LEA GR1,3,GR1

JMP L1

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2024-5-29 02:52

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表