編寫一個程序,實現將存放在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