编写一个程序,实现将存放在AX和DX中的32位数据循环右移二进制数的4位。(DX存放高字节内容,AX存放低字节内容)
P151
例4.9
汇编思路:
AX右移四位后,使用BH接收AL的低四位数据,得到BH的八位数据,循环左移四位,将原先AL中的低四位放到BH的高四位中,最后结果,BH的高四位存放AX的低四位,BH的低四位存放0000H
DX右移四位后,使用BL接收DL的低四位数据,得到BL的八位数据,循环左移四位,将原先DL中的低四位放到BL的高四位中,最后结果,BL的高四位存放DX的低四位,BL的低四位存放0000H
详细过程:这里的CL用来移动位数,即移动4位二进制数据。首先因为AX存放低字节内容,所以循环右移4位之后AL中的低四位会被移除,此时需要使用BH接收AL的低四位数据,但是由于BH和AL存放的都是八位二进制数,所以将AL值赋给BH之后,BH再进行左移只保留AL中的第四位即可,最后,BH的高四位存放AL的低四位,BH的低四位存放0000H。BH的高四位存放AX中的低四位数据,之后AX开始循环右移四位二进制数。
接着,BL存放DL中的低四位数据,DX开始循环右移四位二进制数,BL的低四位存放原先DX的低四位,然后,BL左移四位,即BL的高四位为原先DX的低四位,BL的低四位为0000H。
由于AX已经循环右移了四位,AH的高四位为0000H,AH的低四位存放原先AH的高四位,而且BL高四位存放的是原先DX的低四位,BL的低四位为0000H,AH和BL求或运算,即将BL存放的高四位数据,即DX的低四位,传递给AH的高四位,即AX的高四位。
同样,由于DX已经循环右移了四位,DH的高四位为0000H,DH的低四位存放原先DH的高四位,BH的高四位存放原AX中的低四位,DH和BH求或运算,BH的高四位传递给DH的高四位,DH的低四位存放原DH的高四位。
代码和具体存储器中数值如下:
CODE SEGMENT ; DX,5678H AX,1234HASSUME CS:CODE ; XH XL
START: MOV AX,1234H ; 0001 0010 0011 0100 AXMOV DX,5678H ; 0101 0110 0111 1000 DXMOV CL,04 ; 0000 0100 CLMOV BH,AL ; 0011 0100 BH BH获取AX循环右移四位即将丢失的低四位数据SHL BH,CL ; 0100 0000 BH BH左移四位,将AX失去的低四位放置到BH的高四位处,此时BH高四位为AX原先的低四位,BH的低四位为0000HSHR AX,CL ; 0000 0001 0010 0011 AX BH接收AX的低四位,AX开始循环右移四位MOV BL,DL ; 0111 1000 BL BL接收DX的低四位SHR DX,CL ; 0000 0101 0110 0111 DX BL接收DX的低四位,DX开始循环右移四位SHL BL,CL ; 1000 0000 BL BL左移四位,将DX的低四位放置到BL的高四位处,此时BL高四位为DX原先的低四位,BL的低四位为0000HOR AH,BL ; 1000 0001 AX AH高四位存放0000H,低四位存放原AX的高四位 BL高四位存放原DX的低四位,BL的低四位为0000H 或运算结束后,AX的AH高四位存放原DX的低四位,AH低四位存放原AX的高四位OR DH,BH ; 0100 0101 DH DH高四位存放0000H,低四位存放原DX的高四位 BH高四位存放原AX的低四位,BH的低四位为0000H 或运算结束后,DX的DH高四位存放原AX的低四位,DH低四位存放原DX的高四位MOV AH,4CH ; 0100 0101 0110 0111 DXINT 21H ; 1000 0001 0010 0011 AX
CODE ENDS ; DX,4567H END START ; AX,8123H