移位和循环移位指令如下表:
SHL | 左移 |
---|---|
SHR | 右移 |
SAL | 算术左移 |
SAR | 算术右移 |
ROL | 循环左移 |
ROR | 循环右移 |
RCL | 带进位的循环左移 |
RCR | 带进位的循环右移 |
SHLD | 双精度左移 |
SHRD | 双精度右移 |
移位操作数的位有两种方法,一种是逻辑移位,另一种是算术移位。
逻辑移位:空出来的位用0填充
算术移位:空出来的位用原数据的符号来填充
SHL指令:
SHL destination,count
位元乘法:数值进行左移即执行了位元乘法。任何操作数左移n位,即将该数乘以2的n次方。
SHR指令:
位元除法:数值进行右移即执行了位元除法。任何操作数右移n位,即将该数除以2的n次方。
SAL和SAR指令:SAL的指令和SHL一样,不同的是SAR指令,算术右移最高位要保留。
AX符号扩展到EAX:设AX中有符号数,现将其符号位扩展到EAX。首先把EAX左移16位,再将其算术右移16位。
如下:
mov eax,-128 ;EAX=????FF80H
shl eax,16 ;EAX=FF800000H
sar eax,16 ;EAX=FFFFFF80H
ROL指令:
位元循环:以循环方式来移位
ROL:循环左移,指令把所有位都向左移。最高位复制到进位标志位和最低位。
位组交换:利用ROL可以交换一个字节的高四位和低四位。
当多字节整数以四位为单位进行循环移位时,其效果相等于一次向右或向左移动一个十六进制位。
ROR指令:
ROR:循环右移,指令把所有位都向右移,最低为复制到进位标志位和最高位。
RCL和RCR指令:
RCL:带进位的循环左移,指令把每一位都左移,进位标志位复制到最低位,最高位复制到进位标志位。
从进位标志位恢复位:RCL可以恢复之前移入进位标志位的位。
RCR指令:带进位的循环右移。
有符号数溢出:如果有符号数循环移动一位生成的结果超过了目的操作数的有符号数范围,则溢出标志位置1。
SHLD/SHRD指令:
SHLD:双精度左移,指令将目的操作数左移指定位数。移动形成的空位由源操作数的高位填充。源操作数不变,但是符号标志位,零标志位,辅助进位标志位,奇偶标志位和进位标志位会受影响。
SHLD dest,source,count
SHRD::双精度右移,指令将目的操作数右移指定位数。移动形成的空位由源操作数的低位填充。源操作数不变,但是符号标志位,零标志位,辅助进位标志位,奇偶标志位和进位标志位会受影响。
二进制乘法:
举例如果要乘以36,将36化为2的5次方加上2的平方,再用分配率解决。用汇编可以这样解决:
mov eax,123
mov ebx,eax
shl eax,5
shl ebx,2
add eax,ebx
MUL指令:
MUL reg/mem8
MUL reg/mem16
MUL reg/me32
MUL操作数:
被乘数 | 乘数 | 乘积 |
---|---|---|
AL | reg/mem8 | AX |
AX | reg/mem16 | DX:AX |
EAX | reg/mem32 | EDX:EAX |
IMUL指令:
有符号数乘法。IMUL会保留乘积的符号
单操作数格式:
IMUL reg/mem8 ;AX=AL*reg/mem8
IMUL reg/mem16 ;DX;AX=AX*reg/mem16
IMUL reg/mem32 ;EDX;EAX=EAX*reg/mem32
双操作数格式
IMUL reg32,reg/mem32
IMUL reg32,imm8
IMUL reg32,imm32
三操作数格式:第二个数和第三个数 相乘放在第一个寄存器中
IMUL reg32,reg/mem32,imm8
IMUL reg32,reg/mem32,imm32
DIV指令:
DIV reg/mem8
DIV reg/mem16
DIV reg/mem32
被除数 | 除数 | 商 | 余数 |
---|---|---|---|
AX | reg/mem8 | AL | AH |
DX:AX | reg/mem16 | AX | DX |
EDX:EAX | reg/mem8 | EAX | EDX |
有符号数除法:
几乎和无符号数相同,但是要进行符号扩展
如下代码:
.data
wordval SWORD -101 ;009BH
.code
mov dx,0
mov ax,wordval; DX:AX=0000009BH
cwd ;DX:AX=FFFFF9BH
mov bx,2
idiv bx
有符号扩展指令(CWD,CBW,CDQ)
CBW:字节转字,指令将AL的符号扩展到AH,保留了数据的符号
CWD:字转双字,指令将AX的符号位扩展到DX
CDQ:双字转四字,指令将EAX的符号位扩展到EDX
扩展加减法
ADC指令:带进位加法,指令将源操作数和进位标志位的值都与目的操作数相加。
mov dl,0
mov al,0FFh
add al,0FFh
adc dl,0
SBB指令:带借位减法。指令从目的操作数中减去源操作数和进位标志位的值。
ASCII和非压缩十进制的运算
AAA | 执行加法后进行ASCII调整 |
---|---|
AAS | 执行减法后进行ASCII调整 |
AAM | 执行乘法后进行ASCII调整 |
AAD | 执行除法后进行ASCII调整 |