1.加法指令ADD
add 指令将源与目的操作数相加,结果送到目的操作数。源操作数为立即数时,源操作数带扩展为和目的操作数相同长度类型
ADD reg ,imm/reg/mem ;reg<--reg+imm/reg/mem
ADD mem,imm/reg ;mem<--mem+imm/reg
注意:
源操作数和目标操作数类型匹配
目标不能是立即数和CS段寄存器
两个操作数不能同时为存储器操作数(格式特点:带有[])
对于ADD mem,imm的形式,要指明mem的长度类型(如:BYTE PTR [100H])
示例:
ADD AL, 2050H ;错误,AL寄存器为8位,而立即数为16位
ADD AX,50H ;正确
ADD AX,BL ;错误,前后两个寄存器位数不同
ADD 2050,AX ;错误,目标操作数不能为立即数
ADD CS,2050H ;错误,目标操作数不能为立即数CS段寄存器
ADD [200H],05H ;错误,未指定内存单元的长度类型
ADD BYTE PTR [200H],BYTE PTR [100H] ;错误,不允许源操作数和目的操作数都为mem
ADD指令按状态标志的定义相应设置:
CF OF SF ZF AF PF ----重点理解对CF与OF的影响
2.带进位加法指令ADC
ADC指令将源与目的的操作数相加,再加上进位CF标志,结果送到目的的操作数
ADC指令主要与ADD配合,实现多精度加法运算
ADC reg,imm/reg/mem ;reg<--reg+imm/reg/mem+CF
ADC mem,imm/reg ;mem+imm/reg+CF
计算双字加法:0234 4652H+F0F0 F0F0H:
mov ax,4652h ;ax=4652h
add ax,0f0f0h ;ax=3742h,CF=1
mov dx,0234h ;dx=0234h
adc dx,0f0f0h ;dx=f325h,CF=0
;DX.AX=0234 4652H
+F0F0 F0F0H
=F325 3742H
注:用汇编处理时最多只能处理16位的,在处理高16位加法的时候使用adc
3. 增量指令INC
INC 指令对操作数加1(增量),主要用于对计数器和地址指针的调整
INC 指令不影响进位CF标志,按定义设置其他状态标志
INC reg/mem ;reg/mem<--reg/mem+1
inc bx
inc byte ptr [bx]
4.减法指令SUB
SUB指令将目的操作数减去源操作数,结果送到目的操作数
SUB reg,imm/reg/mem ;reg<--reg-imm/reg/mem
SUB mem,imm/reg ;mem<--mem-imm/reg
注意:
源操作数和目标操作数类型匹配
目标不能是立即数和CS段寄存器
两个操作数不能同时为mem
对于SUB mem,imm的形式,要指明mem的长度类型
5.带借位减法指令SBB
SBB指令将目的操作数减去源操作数,再减去借位CF(进位),结果送到目的操作数
SBB指令主要与SUB配合,实现多精度减法运算
SBB reg,imm/reg/mem ;reg<--reg-imm/reg/mem-CF
SBB mem,imm/reg ;mem<--mem-imm/reg-CF
计算双字减法:0234 4652H-F0F0 F0F0H:
mov ax,4652h ;ax=4652h
sub ax,0f0f0h ;ax=5562h,CF=1
mov dx,0234h ;dx=0234h
sbb dx,0f0f0h ;dx=1143h,CF=1
;DX.AX=0234 4652H
-F0F0 F0F0H
=1143 5562H
6.减量指令DEC
DEC 指令对操作数减1(减量),主要用于对计数器和地址指针的调整
DEC指令不影响进位CF标志,按定义设置其他状态标志
DEC reg/mem ;reg/mem<--reg/mem-1
dec bx
dec byte ptr [bx]
7. 求补指令NEG
NEG 指令对操作数执行求补运算:用零减去操作数,然后结果返回操作数。求补运算也可以表达成:将操作数按位取反后加1
ENG 指令对标志的影响与零做减法SUB指令一样
ENG reg/mem ;reg/mem<--0-reg/mem 例如:求0110 0100 的补码就相当于计算100000000-01100100
mov ax,0ff64h
neg a1 ;ax=ff9h,OF=0、SF=1、ZF=0、CF=1、AF=1
sub al,9dh ;ax=ffffh,OF=0、SF=1、ZF=0、CF=1、AF=1
neg ax ;ax=0001h,OF=0、SF=0、ZF=0、CF=0、AF=1
dec a1 ;ax=0000h,OF=0、SF=0、ZF=1、CF=1、AF=0
neg ax ;ax=0000h,OF=0、SF=0、ZF=1、CF=1、AF=0
8.符号扩展指令(MOVSX):
符号扩展是指用一个操作数的符号位(即最高位)形成另一个操作数,后一个操作数的各位全是0(正数)或全是1(负数)。符号扩展不改变数据大小(符号扩展指高一半是符号位,没有实际的数值)
- 对于数据64H(表示数据100),其最高位D7为0,符号扩展后高8位都是0,成 为0064H(仍表示数据100)
- 对于数据FF00H(表示有符号数-256),其最高位D15为1,符号扩展后高16位都是1,成为ffffff00H(仍表示有符号数-256)
符号扩展指令常用于获得倍长的数据
不影响标志位
CBW ;AL的符号扩展至AH byte to word
;如AL的最高有效位是0,则AH=00
;AL的最高有效位为1,则AH=FFH。AL不变
CWD ;AX的符号扩展至DX word to double word
;如AX的最高有效位是0,则DX=00
;AX的最高有效位为1,则DX=FFFFH。AX不变
9.乘法指令(MUL/IMUL)
MUL r8/m8 ;无符号字节乘法
;AX←AL×r8/m8
MUL r16/m16 ;无符号字乘法
;DX.AX←AX×r16/m16 高字节放入DX,低字节放入AX
IMUL r8/m8 ;有符号字节乘法
;AX←AL×r8/m8
IMUL r16/m16 ;有符号字乘法
;DX.AX←AX×r16/m16
乘法指令如下影响OF和CF标志:
MUL指令——若乘积的高一半(AH或DX)为0,则OF=CF=0;否则OF=CF=1
IMUL指令——若乘积的高一半是低一半的符号扩展,则OF=CF=0;否则均为1
乘法指令对其他状态标志没有定义:
对标志没有定义:指令执行后这些标志是任意的、不可预测的
对标志没有影响:指令执行不改变标志状态
mov al,0b4h ;al=b4h=180
mov bl,11h ;bl=11h=17
mul bl ;ax=al*bl=Obf4h=3060
;ax高8位不为0,所以OF=CF=1
mov al,0b4h ;al=b4h=-76
mov bl,11h ;bl=11h=17
imul bl ;ax=faf4h=-1292
; AX高8位含有效数字,所以OF=CF=1
10.除法指令(DIV/IDIV)
DIV r8/m8 ;无符号字节除法
;AL←AX÷r8/m8的商,Ah←AX÷r8/m8的余数
DIV r16/m16 ;无符号字除法
;AX←DX.AX÷r16/m16的商,DX←DX.AX÷r16/m16的余数
IDIV r8/m8 ;有符号字节除法:
;AL←AX÷r8/m8的商,Ah←AX÷r8/m8的余数
IDIV r16/m16 ;有符号字除法:
;AX←DX.AX÷r16/m16的商,DX←DX.AX÷r16/m16的余数
注意:商和余数分开
mov ax,0400h ;ax=400h=1024
mov bl,b4h ;bl=b4h=180
div bl ;商al=05h=5
;余数ah=7ch=124
mov ax,0400h ;ax=400h=1024
mov bl,b4h ;bl=b4h=-76
idiv bl ;商al=f3h=-13
;余数ah=24h=36
11.零扩展(MOVZE):
无符号整数,进行零位扩展(前面加0实现位数扩展)
MOVZX r16,r8/m8 movzx di,bvar
MOVZX r32,r8/m8/r16/m16 movzx eax,ax
mov al,82h ;AL=82H
movzx bx,al ;AL=82H,BX=0082H
movzx ebx,al ;AL=82H,EBX=00000082H
注:位数加长,大小不变