## 学 Win32 汇编[24] - 移位: 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, 高位不变

;它们的结果影响 OF、SF、ZF、PF、CF
;它们的指令格式相同:
SHL r/m, i8
SHL r/m, CL

; Test24_1.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.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, i8
SHL r/m, CL

; Test24_2.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.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

; Test25_3.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.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

``````

### 涂孟超

3.1 假定(DX)=0B9H，(CL)=3，(CF)=1，确定下列各条指令单独执行后DX中的值。 (1) SHR DX, 1 ；(DX)=05CH (2) SAR DX, CL ；(DX)=17H (3) SHL DX, CL ；(DX)=5C8H (4) SHL DL, 1 ；(DX)=72H ......

2012/09/16
2.8K
1

1.左移指令和右称指令的种类及作用： 左移指令作用:左移指令将操作数的bit位向左移动n位，空出来的位用0填充。 左移指令包含sal和shl，这两条指令的作用是相同的，空出来的位用0填充。 其中左...

guonaihong
2015/09/26
2.4K
0

simpower
2018/10/25
0
0

1.通用数据传送指令 MOV----> move MOV dest,src;dest←src MOV指令把一个字节或字的操作数从源地址src传送至目的地址dest。 MOVSX---->extended move with sign data MOVZX---->extended mo......

2015/10/24
155
0
80x86 寻址方式与指令系统简介

80x86 寻址方式与指令系统简介 【课前思考】 　　（1） 什么是指令和指令系统？指令在什么时候由哪部分来执行？ 　　（2） 8086汇编语言指令由几部分组成？各部分的作用是什么？ 　　（3） ...

TheRoodToDeath
2017/03/14
0
0

mysql grant 用户权限总结

Airship
31分钟前
1
0
RabbitMQ学习（3）

1. 消费端 1. 消费端通过推模式或者拉模式从RabbitMQ中获取并消费消息，当消费者确认处理消息后，可以手动确认消息已被接收，然后就会将该消息从RabbitMQ的队列中标记再清除，消费者端还可以...

42分钟前
1
0
linux mysql(5.7)开启慢查询

chro008
49分钟前
2
0

51分钟前
2
0
《傲慢与偏见》的读书笔记与读后感作文2400字

《傲慢与偏见》的读书笔记与读后感作文2400字： 作者：孙苑馨；笔者按：读书这个习惯是我爸妈养出来的。小时候父母赚的钱除了吃饭穿衣剩下的就是买书了，他们除了买各种新鲜出版的文艺派图书...

59分钟前
3
0