请编制程序,其功能是:内存中连续存放着20个十六位二进制数,对每个数逻辑右移,使其最低位为"1"(值为零的字不变)。 例如: 内存中有A704H(1010011100000100B),0000H,9A58H… 结果为 29C1H(0

admin2010-12-14  28

问题 请编制程序,其功能是:内存中连续存放着20个十六位二进制数,对每个数逻辑右移,使其最低位为"1"(值为零的字不变)。
   例如:
   内存中有A704H(1010011100000100B),0000H,9A58H…
   结果为    29C1H(0010100111000001B),0000H,134BH…
   部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。
   请填空BEGIN和END之间已给出的源程序使其完整(空白已用横线标出,每个空白一般只需一条指令,但采用功能相当的多条指令亦可),或删除BEGIN和END之间原有的代码并白行编程来完成所要求的功能。
   对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。
   试题程序:
   

选项

答案(1)0 (2)TEST (3)NZ (4)SHR (5)LOOP NEXT

解析 此程序要求对内存中的20个十六位二进制数的每一个数逻辑右移,直到最低位为1为止。考查了SHR,TEST,LOOP等指令的用法。
   程序的堆栈段定义了一个128字节的堆栈区。堆栈段下面是数据段。数据段中定义了两个字型变量:原始数据区SOURCE、结果数据区RESULT;两个字节型变量:原始数据文件名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",否则会改变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"。
转载请注明原文地址:https://jikaoti.com/ti/gs27FFFM
0

最新回复(0)