管理员
|
阅读:4727回复:0
[系统教程]Casl汇编语言辅导(2)
楼主#
更多
发布于:2011-10-17 16:01
 | |  |  | [quote] 三、试题解释1、2001年试题三[程序说明] 子程序 DEHZ 用来对 HZ 编码的字串做解码处理。HZ 编码是海外华人创造的一种将含有高位为 1 的汉字双字节字串转换成易于在网络中传输的ASCII 字符串的变换方式。编码过程中,被转换字符串中的原汉字子字符串各字节高位作清零处理,使之成为 ASCII 子字符串,并在其前后两端分别添加 ~{ 和 ~} 作为标记;而对于原 ASCII 子字符串,则将其中的 ~ 改写为 ~~,其余字符不变。DEHZ 解码子程序则是 HZ 编码的复原过程。复原 ASCII 子字符串过程中遇有 ~~ 字符则改写为一个 ~ ,遇有 ~{ 则将其后直至 ~} 标记前的各字节高位置 1,复原为汉字子字符串,同时删除其前后标记。~的后续字符不属于以上情况均作为错误处理。调用该子程序时, GR1 存放原始字符串首地址, GR2 存放还原后的目标字符串首地址。工作寄存器 GR3 用作处理汉字子字符串的识别标志,进入子程序时应初始化为处理 ASCII 子字符串。程序按照 CASL 语言的标准约定,字符串的每个字符只占用一个存储字的低八位。原始字符串和目标字符串均以 0 作为结束标志。[程序][table=87%][tr][td=1,1,9%][/td][td=1,1,13%]START[/td][td=1,1,70%][/td][td=1,1,8%]1[/td][/tr][tr][td=1,1,9%]DEHZ[/td][td=1,1,13%]PUSH[/td][td=1,1,70%]0,GR3[/td][td=1,1,8%]2[/td][/tr][tr][td=1,1,9%][/td][td=1,1,13%]PUSH[/td][td=1,1,70%]0,GR2[/td][td=1,1,8%]3[/td][/tr][tr][td=1,1,9%][/td][td=1,1,13%]PUSH[/td][td=1,1,70%]0,GR1[/td][td=1,1,8%]4[/td][/tr][tr][td=1,1,9%][/td][td=1,1,13%]LEA[/td][td=1,1,70%]GR3,0[/td][td=1,1,8%]5[/td][/tr][tr][td=1,1,9%]LOOP[/td][td=1,1,13%]__(1)__[/td][td=1,1,70%][/td][td=1,1,8%]6[/td][/tr][tr][td=1,1,9%][/td][td=1,1,13%]CPA [/td][td=1,1,70%]GR0,MARK0[/td][td=1,1,8%]7[/td][/tr][tr][td=1,1,9%][/td][td=1,1,13%]JNZ[/td][td=1,1,70%]GOON[/td][td=1,1,8%]8[/td][/tr][tr][td=1,1,9%][/td][td=1,1,13%]LEA[/td][td=1,1,70%]GR1,1,GR1[/td][td=1,1,8%]9[/td][/tr][tr][td=1,1,9%][/td][td=1,1,13%]LD[/td][td=1,1,70%]GR0,0,GR1[/td][td=1,1,8%]10[/td][/tr][tr][td=1,1,9%][/td][td=1,1,13%]CPA[/td][td=1,1,70%]GR0,MARK0[/td][td=1,1,8%]11[/td][/tr][tr][td=1,1,9%][/td][td=1,1,13%]__(2)__[/td][td=1,1,70%][/td][td=1,1,8%]12[/td][/tr][tr][td=1,1,9%][/td][td=1,1,13%]CPA[/td][td=1,1,70%]GR0,MARK1,GR3[/td][td=1,1,8%]13[/td][/tr][tr][td=1,1,9%][/td][td=1,1,13%]JNZ [/td][td=1,1,70%]ERROR[/td][td=1,1,8%]14[/td][/tr][tr][td=1,1,9%][/td][td=1,1,13%]__(3)__[/td][td=1,1,70%][/td][td=1,1,8%]15[/td][/tr][tr][td=1,1,9%][/td][td=1,1,13%]LEA[/td][td=1,1,70%]GR1,1,GR1[/td][td=1,1,8%]16[/td][/tr][tr][td=1,1,9%][/td][td=1,1,13%]JMP[/td][td=1,1,70%]LOOP[/td][td=1,1,8%]17[/td][/tr][tr][td=1,1,9%]ERROR[/td][td=1,1,13%]OUT[/td][td=1,1,70%]ERS1R,ERLEN[/td][td=1,1,8%]18[/td][/tr][tr][td=1,1,9%][/td][td=1,1,13%]JMP[/td][td=1,1,70%]EXIT[/td][td=1,1,8%]19[/td][/tr][tr][td=1,1,9%]GOON[/td][td=1,1,13%]__(4)__[/td][td=1,1,70%][/td][td=1,1,8%]20[/td][/tr][tr][td=1,1,9%][/td][td=1,1,13%]ST[/td][td=1,1,70%]GR0,0,GR2[/td][td=1,1,8%]21[/td][/tr][tr][td=1,1,9%][/td][td=1,1,13%]LEA[/td][td=1,1,70%]GR2,1,GR2[/td][td=1,1,8%]22[/td][/tr][tr][td=1,1,9%][/td][td=1,1,13%]LEA[/td][td=1,1,70%]GR1,1,GR1[/td][td=1,1,8%]23[/td][/tr][tr][td=1,1,9%][/td][td=1,1,13%]CPA[/td][td=1,1,70%]GR0,VO[/td][td=1,1,8%]24[/td][/tr][tr][td=1,1,9%][/td][td=1,1,13%]__(5)__[/td][td=1,1,70%][/td][td=1,1,8%]25[/td][/tr][tr][td=1,1,9%]EXIT[/td][td=1,1,13%]P0P[/td][td=1,1,70%]GR1[/td][td=1,1,8%]26[/td][/tr][tr][td=1,1,9%][/td][td=1,1,13%]P0P[/td][td=1,1,70%]GR2[/td][td=1,1,8%]27[/td][/tr][tr][td=1,1,9%][/td][td=1,1,13%]P0P[/td][td=1,1,70%]GR3[/td][td=1,1,8%]28[/td][/tr][tr][td=1,1,9%][/td][td=1,1,13%]RET[/td][td=1,1,70%][/td][td=1,1,8%]29[/td][/tr][tr][td=1,1,9%]V1[/td][td=1,1,13%]DC[/td][td=1,1,70%]1[/td][td=1,1,8%]30[/td][/tr][tr][td=1,1,9%]V0 [/td][td=1,1,13%]DC[/td][td=1,1,70%]O[/td][td=1,1,8%]31[/td][/tr][tr][td=1,1,9%][/td][td=1,1,13%]DC[/td][td=1,1,70%]#0080[/td][td=1,1,8%]32[/td][/tr][tr][td=1,1,9%]MARK0[/td][td=1,1,13%]DC[/td][td=1,1,70%] '~ '[/td][td=1,1,8%]33[/td][/tr][tr][td=1,1,9%]MARK1[/td][td=1,1,13%]DC[/td][td=1,1,70%]'{ }'[/td][td=1,1,8%]34[/td][/tr][tr][td=1,1,9%]ERSTR[/td][td=1,1,13%]DC[/td][td=1,1,70%]'ERROR!'[/td][td=1,1,8%]35[/td][/tr][tr][td=1,1,9%]ERLEN[/td][td=1,1,13%]DC[/td][td=1,1,70%]6[/td][td=1,1,8%]36[/td][/tr][tr][td=1,1,9%][/td][td=1,1,13%]END[/td][td=1,1,70%][/td][td=1,1,8%]37[/td][/tr][/table] [解] 寄存器作用: 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 。 2、2000年试题四
[程序说明]
(1)本子程序根据每位职工的基本工资(非负值)和他完成产品的超额数或不足数计算该职工的应发工资。 (2)主程序调用时,GR1中给出子程序所需参数的起始地址,参数的存放次序如下表:
[table=27%][tr][td=1,1,31%]GR1[/td][td=1,1,69%]a1[/td][/tr][tr][td=1,1,31%] [/td][td=1,1,69%]b1[/td][/tr][tr][td=1,1,31%] [/td][td=1,1,69%]c1[/td][/tr][tr][td=1,1,31%] [/td][td=1,1,69%]a2[/td][/tr][tr][td=1,1,31%] [/td][td=1,1,69%]b2[/td][/tr][tr][td=1,1,31%] [/td][td=1,1,69%]c2[/td][/tr][tr][td=1,1,31%] [/td][td=1,1,69%]…[/td][/tr][tr][td=1,1,31%] [/td][td=1,1,69%]an[/td][/tr][tr][td=1,1,31%] [/td][td=1,1,69%]bn[/td][/tr][tr][td=1,1,31%] [/td][td=1,1,69%]cn[/td][/tr][tr][td=1,1,31%] [/td][td=1,1,69%]-1(结束标志)[/td][/tr][/table] 其中 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元)。 [程序] [table=85%][tr][td=1,1,14%][/td][td=1,1,12%]START[/td][td=1,1,63%][/td][td=1,1,11%]1[/td][/tr][tr][td=1,1,14%]BEG [/td][td=1,1,12%]PUSH[/td][td=1,1,63%]0,GR1[/td][td=1,1,11%]2[/td][/tr][tr][td=1,1,14%][/td][td=1,1,12%]PUSH[/td][td=1,1,63%]0,GR2[/td][td=1,1,11%]3[/td][/tr][tr][td=1,1,14%][/td][td=1,1,12%]PUSH[/td][td=1,1,63%]0,GR3[/td][td=1,1,11%]4[/td][/tr][tr][td=1,1,14%]L1 [/td][td=1,1,12%]__(1)__[/td][td=1,1,63%][/td][td=1,1,11%]5[/td][/tr][tr][td=1,1,14%][/td][td=1,1,12%]LEA [/td][td=1,1,63%]GR0,0,GR2[/td][td=1,1,11%]6[/td][/tr][tr][td=1,1,14%][/td][td=1,1,12%]JMI[/td][td=1,1,63%]FINISH[/td][td=1,1,11%]7[/td][/tr][tr][td=1,1,14%][/td][td=1,1,12%]LD[/td][td=1,1,63%]GR3,1,GR1[/td][td=1,1,11%]8[/td][/tr][tr][td=1,1,14%][/td][td=1,1,12%]LEA [/td][td=1,1,63%]GR2,0,GR3[/td][td=1,1,11%]9[/td][/tr][tr][td=1,1,14%][/td][td=1,1,12%]AND[/td][td=1,1,63%]GR2,C7FFF[/td][td=1,1,11%]10[/td][/tr][tr][td=1,1,14%][/td][td=1,1,12%]JZE[/td][td=1,1,63%]L3[/td][td=1,1,11%]11[/td][/tr][tr][td=1,1,14%][/td][td=1,1,12%]SRL[/td][td=1,1,63%]GR3,15[/td][td=1,1,11%]12[/td][/tr][tr][td=1,1,14%][/td][td=1,1,12%]LEA[/td][td=1,1,63%]GR2,-1,GR2[/td][td=1,1,11%]13[/td][/tr][tr][td=1,1,14%]L2[/td][td=1,1,12%]__(2)__[/td][td=1,1,63%][/td][td=1,1,11%]14[/td][/tr][tr][td=1,1,14%][/td][td=1,1,12%]LEA[/td][td=1,1,63%]GR2,-4,GR2[/td][td=1,1,11%]15[/td][/tr][tr][td=1,1,14%][/td][td=1,1,12%]JPZ[/td][td=1,1,63%]L2[/td][td=1,1,11%]16[/td][/tr][tr][td=1,1,14%]L3[/td][td=1,1,12%]__(3)__[/td][td=1,1,63%][/td][td=1,1,11%]17[/td][/tr][tr][td=1,1,14%][/td][td=1,1,12%]__(4)__[/td][td=1,1,63%][/td][td=1,1,11%]18[/td][/tr][tr][td=1,1,14%][/td][td=1,1,12%]__(5)__[/td][td=1,1,63%][/td][td=1,1,11%]19[/td][/tr][tr][td=1,1,14%]FINISH[/td][td=1,1,12%]POP[/td][td=1,1,63%]GR3[/td][td=1,1,0%]20[/td][/tr][tr][td=1,1,14%][/td][td=1,1,12%]POP[/td][td=1,1,63%]GR2[/td][td=1,1,11%]21[/td][/tr][tr][td=1,1,14%][/td][td=1,1,12%]POP[/td][td=1,1,63%]GR1[/td][td=1,1,11%]22[/td][/tr][tr][td=1,1,14%][/td][td=1,1,12%]RET[/td][td=1,1,63%][/td][td=1,1,11%]23[/td][/tr][tr][td=1,1,14%]C7FFF[/td][td=1,1,12%]DC[/td][td=1,1,63%]#7FFF[/td][td=1,1,11%]24[/td][/tr][tr][td=1,1,14%]BONUS[/td][td=1,1,12%]DC[/td][td=1,1,63%]10[/td][td=1,1,11%]25[/td][/tr][tr][td=1,1,14%][/td][td=1,1,12%]DC[/td][td=1,1,63%]-5[/td][td=1,1,11%]26[/td][/tr][tr][td=1,1,14%][/td][td=1,1,12%]END[/td][td=1,1,63%][/td][td=1,1,11%]27[/td][/tr][/table] [解]
寄存器作用: 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 3、1999年试题四〖程序4.1〗 [程序4.1说明] 本子程序是对 15 位二进位串,求它的奇校验位,生成 16 位二进制位串,使 16 位二进制位串有奇数个 1。 进入此子程序时,15 位二进制位串在 GR1 的第 1 位至第 15 位,并假定 GR1 的第 0 位是 0,求得的奇校验位装配在 GR1 的第 0 位上。 [程序4.1] [table=82%][tr][td=1,1,16%][/td][td=1,1,21%]START[/td][td=1,1,56%][/td][td=1,1,7%]1[/td][/tr][tr][td=1,1,16%]BEG[/td][td=1,1,21%]PUSH[/td][td=1,1,56%]0,GR2[/td][td=1,1,7%]2[/td][/tr][tr][td=1,1,16%][/td][td=1,1,21%]PUSH[/td][td=1,1,56%]0,GR3[/td][td=1,1,7%]3[/td][/tr][tr][td=1,1,16%][/td][td=1,1,21%]LEA[/td][td=1,1,56%]GR3,1[/td][td=1,1,7%]4[/td][/tr][tr][td=1,1,16%][/td][td=1,1,21%]__ (1) __[/td][td=1,1,56%][/td][td=1,1,7%]5[/td][/tr][tr][td=1,1,16%]L1[/td][td=1,1,21%]SLL[/td][td=1,1,56%]GR2,1[/td][td=1,1,7%]6[/td][/tr][tr][td=1,1,16%][/td][td=1,1,21%]__ (2) __[/td][td=1,1,56%][/td][td=1,1,7%]7[/td][/tr][tr][td=1,1,16%][/td][td=1,1,21%]LEA[/td][td=1,1,56%]GR3,1,GR3[/td][td=1,1,7%]8[/td][/tr][tr][td=1,1,16%]L2[/td][td=1,1,21%]JZE[/td][td=1,1,56%]L3[/td][td=1,1,7%]9[/td][/tr][tr][td=1,1,16%][/td][td=1,1,21%]JMP[/td][td=1,1,56%]L1[/td][td=1,1,7%]10[/td][/tr][tr][td=1,1,16%]L3[/td][td=1,1,21%]__ (3) __[/td][td=1,1,56%][/td][td=1,1,7%]11[/td][/tr][tr][td=1,1,16%][/td][td=1,1,21%]ST[/td][td=1,1,56%]GR3,WORK[/td][td=1,1,7%]12[/td][/tr][tr][td=1,1,16%][/td][td=1,1,21%]ADD[/td][td=1,1,56%]GR1,WORK[/td][td=1,1,7%]13[/td][/tr][tr][td=1,1,16%][/td][td=1,1,21%]POP[/td][td=1,1,56%]GR3[/td][td=1,1,7%]14[/td][/tr][tr][td=1,1,16%][/td][td=1,1,21%]POP[/td][td=1,1,56%]GR2[/td][td=1,1,7%]15[/td][/tr][tr][td=1,1,16%][/td][td=1,1,21%]RET[/td][td=1,1,56%][/td][td=1,1,7%]16[/td][/tr][tr][td=1,1,16%]WORK[/td][td=1,1,21%]DS[/td][td=1,1,56%]1[/td][td=1,1,7%]17[/td][/tr][tr][td=1,1,16%][/td][td=1,1,21%]END[/td][td=1,1,56%][/td][td=1,1,7%]18[/td][/tr][/table][分析] 1)从说明中已知,被转换的二进位串(一个字)放在 GR1 中。 2)第 6 行 "SLL GR2,1" 这条指令是处理奇偶校验用的,因此 GR2 也应该是工作单元,初始值为被处理数,故第 5 行( (1) )应该是 "LEA GR2,0,GR1"。 3)从第 4、5 行看,GR3 是一个计数器(统计值为 1 的位的个数),初始值为 1,即当 GR2 一个 1也没有时,其值为 1(奇校验)。 4)第 6 行 "SLL GR2,1" 将被处理数左移一位,需要判断最高位是否为 1,若是,计数器加 1,否则跳过这条指令。因最高位也是符号位,所以可用 "JPZ L2"( (2) )。 5)第 9 行(L2)"JZE L3"是移位结束条件,即移到结果为 0 时结束。 6)第 11、12、13 行,是在计数器值为奇数(即实际 1 的个数为偶数)时把被处理字 GR1 最高位变成 1。而计数器 GR3 为奇数即其最低位为 1,因此需把 GR3 的最低位变成最高位,所以第 11 行( (3) )应该是:SLL GR3,15 4、1999年试题四〖程序4.2〗[程序4.2说明]子程序 SUM 是将存贮字 A 起的 n(n>0) 个字求和,并将结果存于存贮字 B 中。 调用该子程序时,主程序在 GR1 中给出存放子程序所需参数的起始地址。参数的存放次序如下图:
[table=32%][tr][td=1,1,50%](GR1)+0[/td][td=1,1,50%]A[/td][/tr][tr][td=1,1,50%]+1[/td][td=1,1,50%]n[/td][/tr][tr][td=1,1,50%]+2[/td][td=1,1,50%]B[/td][/tr][/table] [程序4.2] [分析] 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 [程序说明]本程序是统计字符串中数字字符"0"至"9"的出现次数。 字符串中的每个字符是用ASCII码存贮。一个存贮单元存放两个字符,每个字符占8位二进位。 程序中,被统计的字符串从左至右存放在STR开始的连续单元中,并假定其长度不超过200,字符串以'·'符作为结束。NCH开始的10个单元存放统计结果。 [解] 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。 [程序] [解] 这是一个典型的二化十汇编语言题例,其算法是将被转换的二进制数依次被 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 中中给出存放子程序所需参数的起始地址。参数的存放次序如下图: 从子程序返回时,GR0 中存放查找结果,即 M 在此有序表中的位置序数,如表中找不到 M,则 GR0 中返回 0,其它寄存器的内容保持不变。 [程序] [解] 二分法查找的基本思想是对任意一段查找空间 [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"。
| |  | |  |
|