问题:[选择题]
(1)0
(2)TEST
(3)NZ
(4)SHR
(5)LOOPNEXT
程序的堆栈段定义了一个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指令。注意:这里千万不能用指令"ANDAX,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)空填写"LOOPNEXT"。
● 参考解析
此程序要求对内存中的20个十六位二进制数的每一个数逻辑右移,直到最低位为1为止。考查了SHR,TEST,LOOP等指令的用法。