一.?SHL、SHR、SAL、SAR: 移位指令
----------------------------------------------------------------------------------------------------
;SHL(Shift Left):? ? ? 邏輯左移
;SHR(Shift Right):? ? ? 邏輯右移
;SAL(Shift Arithmetic Left): 算術左移
;SAR(Shift Arithmetic Right): 算術右移
;其中的 SHL 和 SAL 相同, 但 SHR 和 SAR 不同.
;SHL、SAL: 每位左移, 低位補 0, 高位進 CF
;SHR? : 每位右移, 低位進 CF, 高位補 0
;SAR? : 每位右移, 低位進 CF, 高位不變,(在每次右移時,保持最高位(符號位)不變,最低位右移至CF中)
;它們的結果影響 OF、SF、ZF、PF、CF
;它們的指令格式相同:SHL r/m, i8SHL r/m, CL
----------------------------------------------------------------------------------------------------
.code
main proc
??? ;SHL、AL
??? mov al, 11100111b
??? shl al, 1
??? PrintHex al ;CE - 11001110b
??? sal al, 2
??? PrintHex al ;38 - 00111000b
???
??? mov al, 11100111b
??? mov cl, 2
??? shl al, cl
??? PrintHex al ;9C - 10011100b
???
??? ;SHR
??? mov al, 11100111b
??? shr al, 2
??? PrintHex al ;39 - 00111001b
???
??? ;SAR
??? mov al, 11100111b
??? sar al, 2
??? PrintHex al ;F9 - 11111001b
??? ret
main endp
end main
------------------------------------------------------------------------------------------------
ROL、ROR、RCL、RCR: 循環移位指令
-----------------------------------------------------------------------------------------------------------------------------------------------
;ROL(Rotate Left):? ? ? ? 循環左移
;ROR(Rotate Right):? ? ? 循環右移
;RCL(Rotate through Carry Left): 帶進位循環左移
;RCR(Rotate through Carry Right): 帶進位循環右移
;ROL: 循環左移, 高位到低位并送 CF
;ROR: 循環右移, 低位到高位并送 CF
;RCL: 循環左移, 進位值(原CF)到低位, 高位進 CF
;RCR: 循環右移, 進位值(原CF)到高位, 低位進 CF
;它們的結果影響 OF、CF
;它們的指令格式相同:SHL r/m, i8SHL r/m, CL
?
?說明: 1. 本指令組只影響標志CF、OF.OF由移入CF的內容決定,OF取決于移位一次后符號位是否改變,如改變,則OF=1.
???????? 2. 由于是循環移位,所以對字節移位8次; 對字移位16次,就可恢復為原操作數.由于帶CF的循環移位,可以將CF的內容移入,所以可以利用它實現多字節的循環.
???????? 3. 示例: 將AL中的組合的兩個BCD分解為兩個未組合的BCD數,存于BH及BL寄存器中程序為:
??????????????? MOV AH,AL? ?;保存AL內容至AH中
??????????????? MOV CL,4????? ;循環次數4送CL
??????????????? SHR??AL,CL???? ;將AL右移4次,高4位移至低4位
??????????????? MOV BH,AL??? ;高位BCD送BH中
??????????????? AND AH,0FH ?;得到低位BCD數
??????????????? MOV BL,AH?? ?;低位BCD數送BL中
注意: 以上程序中的指令SHR AL,CL如改為SAR AL,CL,雖然最高4位可移入低4位,但最高位不為0,故應加入一條指令AND AL,0FH.否則,若最高位不為0時,將得到錯誤結果.
-----------------------------------------------------------------------------------------------------------------------------------------------
.code
main proc
??? ;ROL
??? mov al, 11000011b
??? rol al, 1
??? PrintHex al ;87 - 010000111b
???
??? ;ROR
??? mov al, 11000011b
??? ror al, 1
??? PrintHex al ;E1 - 11100001b
???
??? ;RCL
??? clc
??? mov al, 10101111b
??? rcl al, 1
??? PrintHex al ;5E - 01011110b
???
??? stc
??? mov al, 10101111b
??? rcl al, 1
??? PrintHex al ;5F - 01011111b
???
??? clc
??? mov al, 10101111b
??? rcl al, 2
??? PrintHex al ;BD - 10111101b
???
??? ;RCR
??? clc
??? mov al, 11101011b
??? rcr al, 2
??? PrintHex al ;BA - 10111010b
??? ret
main endp
end main
----------------------------------------------------------------------------------------------------
SHLD、SHRD: 雙精度移位
;SHLD(Double-Precision Shift Left): 雙精度左移
;SHRD(Double-Precision Shift Right): 雙精度右移
;SHLD 和 SHRD 有三個操作數
;操作數三: 是移位數目;操作數一: 是目的操作數
;SHLD 左邊被移出的位由操作數二相同數目的高位填充
;SHRD 右邊被移出的位由操作數二相同數目的低位填充
;操作數二不變, 且須是寄存器;它們的結果影響 OF、SF、ZF、PF、CF
;它們的指令格式相同:
SHLD r16/32/m16/m32, r16/32, i8
SHLD r16/32/m16/m32, r16/32, CL
?
?
?雙精度數左移指令 SHLD
?格式: SHLD OPD,OPS,n(n表示一個常數)
?功能: 指令左移OPD,移位的次數由n確定,移入OPD右邊的各位由OPS提供,這里要求OPD和OPS類型相同,OPD移出的位進入CF.
?
?雙精度數右移指令 SHRD
?格式: SHRD OPD,OPS,n(n表示一個常數)
?功能: 指令右移OPD,移位的次數由n確定,移入OPD左邊的各位由OPS提供,這里要求OPD和??? ----? OPS類型相同,OPD移出的位進入CF.
----------------------------------------------------------------------------------------------------
.code
main proc
??? ;SHLD
??? mov ax, 1100110011110000b
??? mov dx, 1111111100000000b
??? shld ax, dx, 2
??? PrintHex ax ;33C3 - 0011001111000011b
???
??? ;SHRD
??? mov ax, 0000111100110011b
??? mov dx, 0000000011111111b
??? shrd ax, dx, 2
??? PrintHex ax ;C3CC - 1100001111001100b
??? ret
main endp
end main
-----------------------------------------------------------------------------------------------------