编写一个程序,实现将存放在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
