1、三级 PC 技术机试-184 及答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.请编制程序,其功能是:内存中连续存放着 20 个十六位二进制数,对每个数逻辑右移,使其最低位为“1“(值为零的字不变)。例如:内存中有 A704H(1010011100000100B),0000H,9A58H结果为 29C1H(0010100111000001B),0000H,134BH部分程序已给出,其中原始数据由过程 LOAD 从文件 INPUT1.DAT 中读入 SOURCE 开始的内存单元中,运算结果要求从 RESULT 开始存放,由过程 SAVE 保存到
2、文件 OUTPUT1.DAT 中。请填空 BEGIN 和 END 之间已给出的源程序使其完整(空白已用横线标出,每个空白一般只需一条指令,但采用功能相当的多条指令亦可),或删除 BEGIN 和 END 之间原有的代码并白行编程来完成所要求的功能。对程序必须进行汇编,并与 IO.OBJ 链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。试题程序:(分数:100.00)_三级 PC 技术机试-184 答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.请编制程序,其功能是:内存中连续存放着 20 个十六位二进制
3、数,对每个数逻辑右移,使其最低位为“1“(值为零的字不变)。例如:内存中有 A704H(1010011100000100B),0000H,9A58H结果为 29C1H(0010100111000001B),0000H,134BH部分程序已给出,其中原始数据由过程 LOAD 从文件 INPUT1.DAT 中读入 SOURCE 开始的内存单元中,运算结果要求从 RESULT 开始存放,由过程 SAVE 保存到文件 OUTPUT1.DAT 中。请填空 BEGIN 和 END 之间已给出的源程序使其完整(空白已用横线标出,每个空白一般只需一条指令,但采用功能相当的多条指令亦可),或删除 BEGIN 和
4、 END 之间原有的代码并白行编程来完成所要求的功能。对程序必须进行汇编,并与 IO.OBJ 链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。试题程序:(分数:100.00)_正确答案:(1)0(2)TEST(3)NZ(4)SHR(5)LOOP NEXT)解析:解析此程序要求对内存中的 20 个十六位二进制数的每一个数逻辑右移,直到最低位为 1 为止。考查了SHR,TEST,LOOP 等指令的用法。程序的堆栈段定义了一个 128 字节的堆栈区。堆栈段下面是数据段。数据段中定义了两个字型变量:原始数据区 SOURCE、结果数据区 RESULT;两个字节型
5、变量:原始数据文件名 NAME0、结果数据文件名 NAME1。数据段下面是代码段,告诉汇编程序,代码段、数据段和堆栈段分别属于段寄存器 CS、DS、SS。先将原始数据偏移地址装入到 SI 中,结果数据偏移地址装入到 DI 中,CX 赋初值为 N,用于控制循环处理的次数。NEXT 段,将 SI 中内容送 AX 中,再将 AX 与 0 做比较,如果 AL 等于 0,转向 SKIP 段。所以第(1)空填写“0“。LOOP1 段的开始要填写第(2)空,这里是要判断 AX 的最低位是否为 1,判断的方法是将 AX 和 0001H 做TEST 指令。注意:这里千万不能用指令“AND AX,0001H“,否
6、则会改变 AX 的初值而 TEST 指令不改变 AX的值,它的结果只显示在几个状态标志位上。所以第(2)空填写“TEST“。当 TEST 的结果 ZF0,说明 AX的最低位为 1,AL 不需要再逻辑右移了,转向 SKIP 段;否则,ZF1,说明 AX 的最低位为 0,还需要将AX 继续逻辑右移 1 位,无条件转向 LOOP1 段,AX 再逻辑右移 1 位,再判断,若仍不满足最低位为 1,继续右移 1 位,直到 AX 最低位变为 1 为止。所以第(3)、(4)空分别填写“NZ“和 “SHR“。再来看 SKIP 段,当 AX 的最低位为 1,或者 AX 等于 0000H 时,直接将 AX 存入到 DI 中,SI 和 DI 地址都加2,因为原始数据和结果数据都是字型的,它们在内存中都占两个地址。接着从 NEXT 处循环,处理下一个十六位二进制数。所以第(5)空填写“LOOP NEXT“。