1、PC技术机试模拟试卷 63及答案与解析 一、程序设计题 1 编制一个程序,其实现的功能为:将内存中从 SOURCE开始的区域里存放的 20个字节的压缩 BCD码转换为 ASC 码,每个压缩的 BCD码转换为两个 ASC码,并在最高位加上奇校验位,结果存放到 RESULT开始的内存区域。 例如: 内存中有: 73H, 45H 则结果为: 37H, B3H, 34H, B5H 部分程序已经给出,其中原始数据由过程 LOAD从文件 INPUT.DAT中读入以SOURCE开始的内存单元中。运算结果要求从 RESULT开始的内存单元存放,由过程 SAVE保存到文件 OUTPUT.DAT中。 请填空 BE
2、GIN和 END之间已给出的源程序使其完整,空白已经用横线标出,每行空白一般只需要一条指令,但采用功能相当的多条指令也行,考生也可以删除BEGIN和 END之间原有的代码并自行编程来完成要求的功能。 对程序必须进行汇编,并与 IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。 【试题程序】 EXTRN LOAD:FAR,SAVE:FAR N EQU 20 DSEG SEGMENT SOURCE DB N DUP(?) RESULT DB N*2 DUP(0) NAME0 DB INPUT.DAT,0 NAME1 DB OUTPUT.DAT,0
3、 DSEG ENDS SSEG SEGMENT STACK DB 256 DUP(?) SSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG,SS:SSEG START PROC FAR PUSH DS XOR AX,AX PUSH AX MOV AX,DSEG MOV DS,AX LEA DX,SOURCE LEA SI,NAME0 MOV CX,N CALL LOAD ; * BEGIN * LEA SI,SOURCE LEA DI,RESULT MOV CX,N AGAIN: MOV AL,SI MOV AH,AL (1) AND AH,0FOH (
4、2) MOV CL,4 (3) POP CX ADD AL,30H (4) NEXT OR AL,80H NEXT: MOV DI,AL INC DI ADD AH,30H (5) NEXT1 OR AH,80H NEXT1: MOV DI,AH INC DI INC SI LOOP AGAIN ; * END * LEA DX,RESULT LEA SI,NAME1 MOV CX,N*2 CALL SAVE RET START ENDP CSEG ENDS END START PC技术机试模拟试卷 63答案与解析 一、程序设计题 1 【正确答案】 (1) ANDAL,0FH (2) PUSH
5、 CX(3) SHRAH, CL (4) JNP (5) JNP 【试题解析】 题目要求将压缩的 BCD码转换为两个 ASC 码,则首先要将BCD码分离出来,转换为非压缩的 BCD码,然后转换为 ASC 码。最高位要求加奇校验位,所以要对转换以后的数据进行判断,如果数据中 1的个数为奇数的话,则直接将其存储到结果存储区,否则要将数据的最高位变为 1。 程序中,已经将数据的高 4位分离到 AH寄存器中,所以还需要将低 4位的数据分离到一个寄存器中,有后面的程序可以看出应该分离到 AL寄存器中,所以第一个空白处应填写 AND AL,0FH。高 4位数据分离到 AH寄存器以后,需要将数据从高 4位移
6、到低 4位来,变成非组合的 BCD码。由于移动的位数为 4,所以需要使用 CL寄存器,而 CX寄存器被用来作为程序循环次数的控制器,所以需要在使用 CL寄存器之前对 CX进行入栈和出栈操作,即第二个空白处应填 PUSH CX。第三个空白处执行的是右移操作,所以应填为 SHR AH, CL。执行完数据分离以后,将非组合的 BCD码转换为 ASC 码,转换的时候只需要将非组合的 BCD码与 30H执行与操作即可。转换完成后,要在量高位加奇校验位,即要对转换后数据中 1的个数进行判断,所以最后两个空应填 JNP,表示当数据中 1的个数为奇数时跳转到数据存储的程序段执行,否则将数据的最高位变为 1,然后再进行存储。