700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Win32ASM学习[13]:移位指令SHL SHR SAL SAR ROL ROR RCL RCR SHLD SHRD

Win32ASM学习[13]:移位指令SHL SHR SAL SAR ROL ROR RCL RCR SHLD SHRD

时间:2022-04-21 18:17:36

相关推荐

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): 算术左移

;SAR(Shift Arithmetic Right): 算术右移

;其中的 SHL 和 SAL 相同, 但 SHR 和 SAR 不同.

;SHL、SAL: 每位左移, 低位补 0, 高位进 CF

;SHR : 每位右移, 低位进 CF, 高位补 0

;SAR : 每位右移, 低位进 CF, 高位不变,(在每次右移时,保持最高位(符号位)不变,最低位右移至CF中)

;它们的结果影响 OF、SF、ZF、PF、CF

;它们的指令格式相同:SHLr/m, i8SHLr/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

;它们的指令格式相同:SHLr/m, i8SHLr/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

SHRAL,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

;它们的指令格式相同:

SHLDr16/32/m16/m32, r16/32, i8

SHLDr16/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

-----------------------------------------------------------------------------------------------------

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。