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