移位,串操作
1. 移位指令,移出的位保存在CF里
SHL reg/mem, 1/CL ;逻辑左移,右侧补0,移出的位保存在CF里。
SHR reg/mem, 1/CL ;逻辑右移,左侧补0,移出的位保存在CF里。
SAL reg/mem, 1/CL ;算数左移,等同于逻辑左移,机器码也相同
SAR reg/mem, 1/CL ;算数右移,左侧补符号位,移出的位保存在CF里。
8086只能移1位,更多则需要存放在CL中,80386开始没有此限制。
如果进行了1位的移动操作,导致符号位改变了,则OF=1,如果移动位数大于1,则OF不确定。
ROL reg/mem, 1/CL ;循环左移,移出的位放在右侧,同时也放在CF里。
ROR reg/mem, 1/CL ;循环右移,移出的位保存左侧,同时也放在CF里。
同样,如果进行了1位的移动操作,导致符号位改变了,则OF=1,如果移动位数大于1,则OF不确定。
RCL reg/mem, 1/CL ;带进位循环左移,移出的位放在CF里,原CF放到最右侧。
RCR reg/mem, 1/CL ;带进位循环右移,移出的位保存CF里,原CF放到最左侧。
同样,如果进行了1位的移动操作,导致符号位改变了,则OF=1,如果移动位数大于1,则OF不确定。
将DX.AX表示的数左移一位,可用以下代码:
SHL AX, 1 ;AX的最高位到了CF中
RCL DX, 1 ;DX最低位补上CF中的位,最高位移出,放到CF中
- 串操作指令
汇编中的串指的是数据块。
MOVSB ;ES:[DI] <-- DS:[SI], SI±1, DI±1, DF控制传送方向
MOVSW ;ES:[DI] <-- DS:[SI], SI±2, DI±2, DF控制传送方向
MOVSD ;ES:[EDI] <-- DS:[ESI], ESI±4, EDI±4, DF控制传送方向
类似于memcpy
STOSB ;ES:[DI] <-- AL, DI±1, DF控制传送方向
STOSW ;ES:[DI] <-- AH, DI±2, DF控制传送方向
STWSD ;ES:[EDI] <-- EAX, EDI±4, DF控制传送方向
类似于memset
LODSB ;AL <-- DS:[SI], SI±1, DF控制传送方向
LODSW ;AX <-- DS:[SI], SI±2, DF控制传送方向
LODSD ;EAX <-- DS:[ESI], ESI±4, DF控制传送方向
CMPSB ;DS:[SI] - ES:[DI], 不保存结果,影响标志位, SI±1, DF控制传送方向
CMPSW ;DS:[SI] - ES:[DI], 不保存结果,影响标志位, SI±2, DF控制传送方向
CMPSD ;DS:[SI] - ES:[DI], 不保存结果,影响标志位, SI±4, DF控制传送方向
类似于memcmp
SCASB ;AL - ES:[DI], 不保存结果,影响标志位, SI±1, DF控制传送方向
SCASW ;AX - ES:[DI], 不保存结果,影响标志位, SI±2, DF控制传送方向
SCASD ;EAX - ES:[EDI], 不保存结果,影响标志位, SI±4, DF控制传送方向
类似于memchr
REP ;机器码和REPZ/REPE相同
MOVSB
CX != 0时,重复操作,每次都--CX
REPZ/REPE ;机器码和REP相同,CX!=0且ZF=1时重复执行
REPNZ/REPNE ;cx!=0且ZF=0时重复执行