一、移位与循环移位指令
- 指令类型(都会改变 CF)
- 逻辑移位 :SHL(逻辑左移)、SHR(逻辑右移)。例如,SHL 指令将操作数左移,++最低位补 0++ ,最高位进入进位标志 CF;SHR 指令右移时,++最高位补 0++,最低位进入 CF。
- 算术移位 :SAL(算术左移)、SAR(算术右移)。与逻辑移位不同在于带符号,算术左移和逻辑左移在二进制位移动上相同,但++算术右移时,负数最高位补 1,正数补 0++,而逻辑右移一律补 0。
- 循环移位 :ROL(循环左移)、ROR(循环右移)。循环左移时最低位以最高位填充,++最高位传送到 CF++ ;循环右移++反之++ ,且不丢弃数据,可用于将特定位移入 CF。
- 带进位的循环移位 :RCL(带进位循环左移)、RCR(带进位循环右移)。在循环移位基础上保留 CF 原数据,移动方式类似循环移位。
RCL al,3
这里 3 是移动位数
- 以 RCL 为例,数组高位移入 CF,CF 移入低位
- 双精度移位 :SHLD(双精度左移)、SHRD(双精度右移),用于对双字数据的移位操作。
SHLD 目的操作数,源操作数,1(次数)
- 应用示例
- 位元乘除法:SHL 可实现位元乘法,如将 5(00000101)左移 1 位得 10(00001010),相当于乘以 2;SHR 可实现位元除法,如 32(00100000)右移 1 位得 16(00010000)。
二、乘法指令
- MUL 指令(无符号数乘法)
- 操作数规则 :8 位操作数与 AL 寄存器相乘,结果存于 AX;16 位操作数与 AX 相乘,结果存于 DX:AX;32 位操作数与 EAX 相乘,结果存于 EDX:EAX。
- 8 位:
- 16 位:
- 特点 :乘积是被乘数与乘数大小的 2 倍以防止溢出;会用到 CF 标志寄存器,乘积高半部分不为零则 CF 置 1;乘数和被乘数大小相同。例如,
mov al,5h,mov bl,10h,mul bl
后 AX = 0050h,CF = 0。
- IMUL 指令(有符号数乘法)
- 与 MUL 区别:保留乘积符号;有三种格式(单、双、三操作数);若乘积高半部分不是低半部分符号扩展,则 CF = 1、OF = 1,可据此忽略高半部分。如 mov al,48,mov imul b1 b1,4 后,ax = 00C0h,OF = 1。
三、除法指令
- DIV 指令(无符号数除法指令):被除数为 AX 时,除数为 reg/mem8,商存于 AL,余数存于 AH;被除数为 DX:AX 时,除数为 reg/mem16,商存于 AX,余数存于 DX;被除数为 EDX:EAX 时,除数为 reg/mem32,商存于 EAX,余数存于 EDX。如 mov ax,0083h,mov bl,2,div bl 后 AL = 41h,AH = 01h。
- 示例 1(8 位除法):![](https://i-blog.csdnimg.cn/img_convert/1014ae9a3b01c9a4463a00e094fc28d5.png)
- 图示:![](https://i-blog.csdnimg.cn/img_convert/779c1bd7d40f71b0e99f181b9073b363.png)
- 示例 2(16 位除法):![](https://i-blog.csdnimg.cn/img_convert/51a9d2fdb90ad957ecf1d8e5ffae0c99.png)
- iDIV 指令(有符号数除法):执行前需进行符号扩展(如 CBW、CWD、CDQ 指令)。如.data wordVal SWORD -101,mov dx,0,mov ax, wordVal,cwd 后再进行除法操作。
四、扩展加减法
- ADC 指令 :格式与 ADD 类似,逻辑:目的操作数 = 目的操作数 + 源操作数 + 进位标志位的值,结果存于 2 倍大小的寄存器。如
- SBB 指令:目的操作数 = 目的操作数 - 源操作数 - 进位标志位的值。如 mov edx,7,mov eax,1,sub eax,2,sbb edx,0 实现了对无大小限制数的加减法操作。