Win32ASM学习[13]:移位指令SHL,SHR,SAL,SAR,ROL,ROR,RCL,RCR,SHLD,SHRD
一.?SHL、SHR、SAL、SAR: 移位指令
----------------------------------------------------------------------------------------------------
;SHL(Shift Left):? ? ? 邏輯左移
;SHR(Shift Right):? ? ? 邏輯右移
;SAL(Shift Arithmetic Left): 算術(shù)左移
;SAR(Shift Arithmetic Right): 算術(shù)右移
;其中的 SHL 和 SAL 相同, 但 SHR 和 SAR 不同.
;SHL、SAL: 每位左移, 低位補 0, 高位進(jìn) CF
;SHR? : 每位右移, 低位進(jìn) CF, 高位補 0
;SAR? : 每位右移, 低位進(jìn) CF, 高位不變,(在每次右移時,保持最高位(符號位)不變,最低位右移至CF中)
;它們的結(jié)果影響 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: 循環(huán)移位指令
-----------------------------------------------------------------------------------------------------------------------------------------------
;ROL(Rotate Left):? ? ? ? 循環(huán)左移
;ROR(Rotate Right):? ? ? 循環(huán)右移
;RCL(Rotate through Carry Left): 帶進(jìn)位循環(huán)左移
;RCR(Rotate through Carry Right): 帶進(jìn)位循環(huán)右移
;ROL: 循環(huán)左移, 高位到低位并送 CF
;ROR: 循環(huán)右移, 低位到高位并送 CF
;RCL: 循環(huán)左移, 進(jìn)位值(原CF)到低位, 高位進(jìn) CF
;RCR: 循環(huán)右移, 進(jìn)位值(原CF)到高位, 低位進(jìn) CF
;它們的結(jié)果影響 OF、CF
;它們的指令格式相同:SHL r/m, i8SHL r/m, CL
?
?說明: 1. 本指令組只影響標(biāo)志CF、OF.OF由移入CF的內(nèi)容決定,OF取決于移位一次后符號位是否改變,如改變,則OF=1.
???????? 2. 由于是循環(huán)移位,所以對字節(jié)移位8次; 對字移位16次,就可恢復(fù)為原操作數(shù).由于帶CF的循環(huán)移位,可以將CF的內(nèi)容移入,所以可以利用它實現(xiàn)多字節(jié)的循環(huán).
???????? 3. 示例: 將AL中的組合的兩個BCD分解為兩個未組合的BCD數(shù),存于BH及BL寄存器中程序為:
??????????????? MOV AH,AL? ?;保存AL內(nèi)容至AH中
??????????????? MOV CL,4????? ;循環(huán)次數(shù)4送CL
??????????????? SHR??AL,CL???? ;將AL右移4次,高4位移至低4位
??????????????? MOV BH,AL??? ;高位BCD送BH中
??????????????? AND AH,0FH ?;得到低位BCD數(shù)
??????????????? MOV BL,AH?? ?;低位BCD數(shù)送BL中
注意: 以上程序中的指令SHR AL,CL如改為SAR AL,CL,雖然最高4位可移入低4位,但最高位不為0,故應(yīng)加入一條指令A(yù)ND AL,0FH.否則,若最高位不為0時,將得到錯誤結(jié)果.
-----------------------------------------------------------------------------------------------------------------------------------------------
.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 有三個操作數(shù)
;操作數(shù)三: 是移位數(shù)目;操作數(shù)一: 是目的操作數(shù)
;SHLD 左邊被移出的位由操作數(shù)二相同數(shù)目的高位填充
;SHRD 右邊被移出的位由操作數(shù)二相同數(shù)目的低位填充
;操作數(shù)二不變, 且須是寄存器;它們的結(jié)果影響 OF、SF、ZF、PF、CF
;它們的指令格式相同:
SHLD r16/32/m16/m32, r16/32, i8
SHLD r16/32/m16/m32, r16/32, CL
?
?
?雙精度數(shù)左移指令 SHLD
?格式: SHLD OPD,OPS,n(n表示一個常數(shù))
?功能: 指令左移OPD,移位的次數(shù)由n確定,移入OPD右邊的各位由OPS提供,這里要求OPD和OPS類型相同,OPD移出的位進(jìn)入CF.
?
?雙精度數(shù)右移指令 SHRD
?格式: SHRD OPD,OPS,n(n表示一個常數(shù))
?功能: 指令右移OPD,移位的次數(shù)由n確定,移入OPD左邊的各位由OPS提供,這里要求OPD和??? ----? OPS類型相同,OPD移出的位進(jìn)入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
-----------------------------------------------------------------------------------------------------
總結(jié)
以上是生活随笔為你收集整理的Win32ASM学习[13]:移位指令SHL,SHR,SAL,SAR,ROL,ROR,RCL,RCR,SHLD,SHRD的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 正版ug多少钱啊?
- 下一篇: 圆通加盟费多少钱啊?