一 移位和循环移位指令
1.逻辑移位和算术移位
逻辑移位是以0填充移出的位
算术移位是以符号位填充移出的位
2.SHL指令
对目的操作数做逻辑左移操作,最低位以0填充,并将最后移出的位放入CF标志中
mov al, 10001111b
shl al, 2 ;cf = 0
3.SHR指令
对目的操作数做逻辑右移运算,移出的数据位以0代替, 最后移出的位被放进CF标志中
mov al, 00000010b
shr al, 2 ;cf = 1
4.SAL和SAR指令
SAL与SHL等价, SAR执行算术右移
mov al, 11110000b
sar al, 1 ; al = 11111000, cf = 0
5.ROL指令
ROL指令在想左移移位后,把移出的位同时复制到进位标志和最低位中。
mov al, 01000000b
rol al, 1 ;al = 10000000b, cf = 0
rol al, 1 ;al = 00000001b, cf = 1
6.ROR指令
向右移位, 把移出的位复制到进位标志和最高位中。
mov al, 00000001b
ror al, 1 ;al = 10000000b, cf = 1
7.RCL和RCR指令
RCL指令在每位左移后, 把进位标志复制到最低有效位中,把最高有效位复制到进位标志
这个指令可以用来从进位标志中恢复一个位:
.data
testval BYTE 01101010b
.code
shr testval, 1 ;右移移位
jc exit ;如果最低位是1, 跳转
rcl testval, 1 ;否则恢复该位
RCR指令把每位右移, 把进位标志复制到最高有效位中,并把最低有效位复制到进位标志中
8.SHLD/SHRD指令
SHLD把目的操作数左移指定位数,左移空出来的位用源操作数的高位填充,指令对源操作数没影响
寄存器标志位受影响
SHLD 目的操作数,源操作数,移位位数
SHRD把目的操作数向右移动指定位数,空出来的位由源操作数的低位填充。
SHRD 目的操作数, 源操作数, 移位位数
二 乘法和除法指令
1.MUL指令
无符号MUL有三种格式
将8位操作数和AL相乘 MUL r/m8 结果存放到 AX中
将16位操作数和ax相乘 MUL r/m16 结果存放到 DX:AX中
将32位操作数和eax相乘 NUL r/m32 结果存放到 EDX:EAX中
如果积的高半部分不为0, 就设置进位和溢出标志。由于是无符号,只关心进位标志
mov al, 5h
mov bl, 10h
mul bl ;ax = 50h, cf = 0
mov ax, 2000h
mov bx, 0100h
mul bx ; DX:AX= 00200000h, cf=1
2.IMUL指令
IMUL执行有符号整数的乘法, 保留乘积的符号位,IMUL指令由三种格式,单操作数, 双操作数,三操作数。
单操作数把乘积存储在累加器中
IMUL r/m8 存放到AX
IMUL, r/m16 存放到DX:AX中
IMUL, r/m32 存放到ESX:EAX中
如果乘积的高半部分不是低半部分的符号扩展, 进位标志和溢出标志置位
双操作数格式把乘积存储在第一个操作数中,第一个操作数必须是寄存器,第二个操作数可以是寄存器,内存或者立即数:
IMUL r16, r/m16
IMUL r16, imm8
IMUL r16, imm16
IMUL r32, r/m32
IMUL r32, imm8
IMUL r32, imm32
双操作数格式会根据操作数的大小进行裁剪, 如果有效位丢失, 则溢出标志和进位标志置位。
三操作数格式吧乘积存储在第一个操作数中, 一个16位的寄存器可被一个8位或16位的立即数乘
IMUL r16, r/m16, imm8
IMUL r16, r/m16, imm16
一个32位寄存器可被一个8位或者32位的立即数相乘:
IMUL r32, r/m32, imm8
IMUL r32, r/m32, imm32
如果有效位丢失,则进位和溢出标志置位。
3.DIV指令无符号整数除法
执行8位, 16位, 32位无符号整数除法运算指令中唯一的一个寄存器或者内存操作数是除数
DIV r/m8 被除数AX 商 AL 余数AH
DIV R/M16 被除数DX:AX 商AX 余数DX
DIV R/M32 被除数EDX:EAX 商EAX 余数EDX
4. IDIV 有符号整数除法
在进行除法之前,隐含的被除数必须进行符号扩展
符号扩展指令CBW 扩展AL的符号位到AH中。
CWD指令扩展AX符号至DX中
CDQ扩展EAX的符号位至EDX中
下面是-48除以5
mov al, -48
cbw
mov bl, 5
idiv bl
三 扩展加法
1.ADC指令
把源操作数,目的操作数以及进位标志相加, 指令格式与MOV指令是一样的
mov dl, 0
mov al, 0ffh
add al, 0ffh
adc dl, 0 ;dl = 1
2.SBB指令
从目的操作数中减去源操作数和进位标志的值,指令允许操作数与ADC指令相同
1.逻辑移位和算术移位
逻辑移位是以0填充移出的位
算术移位是以符号位填充移出的位
2.SHL指令
对目的操作数做逻辑左移操作,最低位以0填充,并将最后移出的位放入CF标志中
mov al, 10001111b
shl al, 2 ;cf = 0
3.SHR指令
对目的操作数做逻辑右移运算,移出的数据位以0代替, 最后移出的位被放进CF标志中
mov al, 00000010b
shr al, 2 ;cf = 1
4.SAL和SAR指令
SAL与SHL等价, SAR执行算术右移
mov al, 11110000b
sar al, 1 ; al = 11111000, cf = 0
5.ROL指令
ROL指令在想左移移位后,把移出的位同时复制到进位标志和最低位中。
mov al, 01000000b
rol al, 1 ;al = 10000000b, cf = 0
rol al, 1 ;al = 00000001b, cf = 1
6.ROR指令
向右移位, 把移出的位复制到进位标志和最高位中。
mov al, 00000001b
ror al, 1 ;al = 10000000b, cf = 1
7.RCL和RCR指令
RCL指令在每位左移后, 把进位标志复制到最低有效位中,把最高有效位复制到进位标志
这个指令可以用来从进位标志中恢复一个位:
.data
testval BYTE 01101010b
.code
shr testval, 1 ;右移移位
jc exit ;如果最低位是1, 跳转
rcl testval, 1 ;否则恢复该位
RCR指令把每位右移, 把进位标志复制到最高有效位中,并把最低有效位复制到进位标志中
8.SHLD/SHRD指令
SHLD把目的操作数左移指定位数,左移空出来的位用源操作数的高位填充,指令对源操作数没影响
寄存器标志位受影响
SHLD 目的操作数,源操作数,移位位数
SHRD把目的操作数向右移动指定位数,空出来的位由源操作数的低位填充。
SHRD 目的操作数, 源操作数, 移位位数
二 乘法和除法指令
1.MUL指令
无符号MUL有三种格式
将8位操作数和AL相乘 MUL r/m8 结果存放到 AX中
将16位操作数和ax相乘 MUL r/m16 结果存放到 DX:AX中
将32位操作数和eax相乘 NUL r/m32 结果存放到 EDX:EAX中
如果积的高半部分不为0, 就设置进位和溢出标志。由于是无符号,只关心进位标志
mov al, 5h
mov bl, 10h
mul bl ;ax = 50h, cf = 0
mov ax, 2000h
mov bx, 0100h
mul bx ; DX:AX= 00200000h, cf=1
2.IMUL指令
IMUL执行有符号整数的乘法, 保留乘积的符号位,IMUL指令由三种格式,单操作数, 双操作数,三操作数。
单操作数把乘积存储在累加器中
IMUL r/m8 存放到AX
IMUL, r/m16 存放到DX:AX中
IMUL, r/m32 存放到ESX:EAX中
如果乘积的高半部分不是低半部分的符号扩展, 进位标志和溢出标志置位
双操作数格式把乘积存储在第一个操作数中,第一个操作数必须是寄存器,第二个操作数可以是寄存器,内存或者立即数:
IMUL r16, r/m16
IMUL r16, imm8
IMUL r16, imm16
IMUL r32, r/m32
IMUL r32, imm8
IMUL r32, imm32
双操作数格式会根据操作数的大小进行裁剪, 如果有效位丢失, 则溢出标志和进位标志置位。
三操作数格式吧乘积存储在第一个操作数中, 一个16位的寄存器可被一个8位或16位的立即数乘
IMUL r16, r/m16, imm8
IMUL r16, r/m16, imm16
一个32位寄存器可被一个8位或者32位的立即数相乘:
IMUL r32, r/m32, imm8
IMUL r32, r/m32, imm32
如果有效位丢失,则进位和溢出标志置位。
3.DIV指令无符号整数除法
执行8位, 16位, 32位无符号整数除法运算指令中唯一的一个寄存器或者内存操作数是除数
DIV r/m8 被除数AX 商 AL 余数AH
DIV R/M16 被除数DX:AX 商AX 余数DX
DIV R/M32 被除数EDX:EAX 商EAX 余数EDX
4. IDIV 有符号整数除法
在进行除法之前,隐含的被除数必须进行符号扩展
符号扩展指令CBW 扩展AL的符号位到AH中。
CWD指令扩展AX符号至DX中
CDQ扩展EAX的符号位至EDX中
下面是-48除以5
mov al, -48
cbw
mov bl, 5
idiv bl
三 扩展加法
1.ADC指令
把源操作数,目的操作数以及进位标志相加, 指令格式与MOV指令是一样的
mov dl, 0
mov al, 0ffh
add al, 0ffh
adc dl, 0 ;dl = 1
2.SBB指令
从目的操作数中减去源操作数和进位标志的值,指令允许操作数与ADC指令相同