目录
一、数据传送类指令
1.通用数据传送指令——mov,xchg,xlat
2.堆栈操作指令——push,pop
3.标志传送指令——lahf,sahf,pushf,popf
4.地址传送指令——lea,lds/les
二、算术运算类指令
1.状态标志
2.加法指令——根据结果设置标志位
3.减法指令
4.乘法指令
5.除法指令
6.符号扩展指令——零位扩展,符号扩展
7.十进制调整指令
(1)压缩BCD码调整指令
(2)非压缩BCD码调整指令
三、位操作类指令
1.逻辑运算指令
(1)逻辑与AND
(2)逻辑或OR
(3)逻辑异或XOR
(4)逻辑非指令NOT
(5)测试指令TEST
2.移位指令
3.循环移位指令
四、控制转移指令
1.无条件转移指令JMP
2.条件转移指令(只有短转移!)
3.循环指令
4.子程序指令
5.中断指令
五、处理机控制类指令
1.空操作指令nop
2.段前缀超越指令SEG
3.封锁前缀指令LOCK
4.暂停指令HIT
5.交权指令ESC
6.等待指令WAIT
功能:将src中的数据传送至dest
mov dest,src
支持的操作数:
mov reg/mem,imm
mov reg/mem/seg,reg
mov reg/seg,mem
mov reg/mem,seg
注:不允许段寄存器之间和内存单元之间的直接数据传送
功能:将reg和reg/mem中的内容交换
注:不能用在存储器和存储器之间的数据交换
xchg reg,reg/mem
或
xchg reg/mem,reg
功能:将BX指定的缓冲区中,AL指定的位移处的数据取出赋值给AL
xlat label ;label为首地址符号,既便于阅读也便于明确缓冲区所在的逻辑段
xlat ;al<--ds:[bx+al]
注:两种格式完全等效
功能:把一个字操作数存入堆栈顶部(低字节存放于低地址,高字节存放于高地址)
格式:
push r16/m16/seg
功能:把栈顶的一个字传送至指定的目的操作数
格式:
pop r16/m16/seg
用来临时存放数据,以便随时恢复它们
lahf将标志寄存器的低字节(8位)送寄存器AH,即状态标志位SF/ZF/AF/PF/CF分别送入AH的第7/6/4/2/0位,而AH的第5/3/1位任意
lahf ;ah<--flags的低字节
sahf将AH寄存器内容送FLAGS的低字节(8位)
sahf ;flags的低字节<--ah
pushf ;sp<--sp-2,ss:[sp]<--flags
popf ;falgs<--ss:[sp],sp<--sp+2
lea指令将存储器操作数的有效地址传送至指定寄存器
lea r16,mem
例:
mov bx,0400h
mov si,3ch
lea bx,[bx+si+0f62h] ;bx<--bx+si+of62h=0400h+3ch+0f62h=139eh
lds r16,mem ;r16<--mem,ds<--mem+2
les r16,mem ;r16<--mem,es<--mem+2
进位标志CF(对于无符号整数):进位为1,不进位为0
溢出标志OF(对于有符号整数):溢出为1,不溢出为0
注:只有当两个相同符号数相加(含不同符号数相减),而运算结果的符号相反时,OF=1
零标志ZF:结果为0则ZF=1
符号标志SF:负数(最高位为1)为1
奇偶标志PF:最低字节中“1”的个数,若为偶数,则PF=1,若为奇数,则PF=0
调整标志AF:反映加减运算时最低半字节有无进位或借位,有为1,无为0
add reg,imm/reg/mem ;reg<--reg+imm/reg/mem
add mem,imm/reg
adc reg,imm/reg/mem ;reg<--reg+imm/reg/mem+cf
adc mem,imm/reg
inc reg/mem ;reg/mem<--reg/mem+1
sub reg,imm/reg/mem ;reg<--reg-imm/reg/mem
sub mem,imm/reg
sbb reg,imm/reg/mem ;reg<--reg-imm/reg/mem-cf
sbb mem,imm/reg
dec不影响CF
Dec reg/mem ;reg/mem<--reg/mem-1
neg reg/mem ;reg/mem<--0-reg/mem
cmp reg,imm/reg/mem
cmp mem,imm/reg
cmp指令将目的操作数减去源操作数(与SUB一样),但结果不返回目的操作数
cmp用于比较两个操作数的大小关系,执行cmp指令后,可以根据标志判断两个数是否相等,大小关系等。
mul r8/m8 ;无符号字节乘:ax<--al*r8/m8
mul r16/m16 ;无符号字乘:dx.ax<--ax*r16/m16
imul r8/m8 ;有符号字节乘:ax<--al*r8/m8
imul r16/m16 ;有符号字乘:dx.ax<--ax*r16/m16
注:对CF/OF,结果中高一半有有效数,则CF/OF=1,否则为0;对其他的状态标志没有定义
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的余数
没有指令,直接对高位赋值0就可以
cbw ;al符号扩展到ax
cwd ;ax符号扩展到dx和ax寄存器对(dx,ax)
daa ;al<--将al中的加和调整为压缩bcd码
das ;al<--将al中的减差调整为压缩BCD码
标志位:对OF无定义,按结果影响所有其他标志
例:
mov al,68h
mov bl 28h
add al,bl ;二进制数加法al=90h
daa ;十进制调整:al=96h=(68+28)h
aaa ;al<--将al中的加和调整为非压缩bcd码,只影响CF和AF
aas ;al<--将al中的减差调整为非压缩bcd码,只影响CF和AF
aam ;ax<--将ax中的乘积调整为非压缩bcd码,根据结果设置SF,ZF,PF,
对OF,CF,AF无意义
aad ;ax<--将ax中的非压缩bcd码扩展成二进制数,即al<--10x*ah+al,ah<--0,
根据结果设置SF,ZF,PF,
对OF,CF,AF无意义
例:
乘法
mov ax,0608h ;ax=0608h,表示非压缩BCD码68
mov bl,09h ;bl=90h,表示非压缩BCD码9
mul bl ;二进制数乘法:ax=08h*09h=0048h
aam ;十进制调整:ax=0702h,实现非压缩BCD码乘法:8*9=72
除法
mov ax,0608h ;ax=0608h,表示非压缩BCD码68
mov bl,09h ;bl=09h,表示非压缩BCD码9
aad ;二进制扩展:ax=68=0044h
div bl ;除法运算:商al=07h,余数ah=05h
;实现非压缩BCD码除法:68=7*9+5
注:所有双操作数均设置CF=OF=0,根据结果SF、ZF、PF状态,对AF无定义
全为1则为1,否则为0
作用:复位一些位(清0)
有一个是1则为1
作用:置位某些位(置1)
不同则为1
作用:
(1)求反某些位
例:将BL中D0和D3求反,其余位不变,则
xor bl,00001001b
(2)给寄存器清0,同时使CF清0
xor ax,ax
注:not不影响标志位!
格式:
not reg/mem
test指令对两个操作数执行按位的逻辑与运算,但结果不回到目的操作数。
执行的操作与AND指令相同,但不保存结果,只根据结果来设置状态标志。
作用:通常用于检测一些条件是否满足又不希望改变原操作数的情况。
例:测试某一位(几位)是否(同时)为0或为1
test al,01h ;测试al的最低位d0
jnz there ;标志zf-0,即d0=1,则程序转移到there
...
there: ...
移位指令可以分为逻辑移位指令和算术移位指令,分别有左移和右移操作
shl reg/mem,1/cl ;逻辑左移:reg/mem左移1/cl位,最低位补0,最高位进入cf
shr reg/mem,1/cl ;逻辑右移,reg/mem右移1/cl位,最高位补0,最低位进入cf
sal reg/mem,1/cl ;算术左移,功能与shl相同
sar reg.mem,1/cl ;算术右移,reg.mem右移1/cl位,最高位不变,最低位进入cf
移位指令按照移入的位设置进位标志CF,根据移位后的结果影响SF、ZF、PF,对AF没有定义
如果进行1位移动,则按照操作数的最高符号位是否改变,相应设置溢出标志OF,如果移位前的操作数最高位与移位后操作数的最高位不同,则OF=1,否则OF=0
当移位次数大于1时,CF不确定
分为不带进位循环移位和带进位循环移位
rol reg/mem,1/cl ;不带进位循环左移
ror reg/mem,1/cl ;不带进位循环右移
rcl ref/mem,1/cl ;带进位循环左移
rcr ref/mem,1/cl ;带进位循环右移
带进位循环将进位标志CF纳入循环额外i中,与操作数一起构成9位或17位二进制数一起移位
循环移位指令按照功能设置进位标志CF,不影响SF、ZF、PF、AF标志。
对OF标志的影响,与前面介绍的移位指令一样。
1)段内转移
分为短转移(转移范围用8位数表示)和近转移(地址位移用16位数表示)
2)段间转移/远转移
目标地址必须用一个32位数表达
不影响标志,但是要利用标志
1)判断单个标志位状态
2)用于比较无符号数高低
解释:高(above),低(below)
JB(JNAE):低于
JNB(JAE):不低于
JBE(JNA):低于等于
JNBE(JA):不低于等于(高于)
3)用于比较有符号数大小
解释:大(greater),小(less)
JL(JNGE):小于
JNL(JGE):不小于
JLE(JNG):不大于
JNLE(JG):不小于等于(大于)
jcxz label ;cx=0则转移,否则顺序执行
loop label ;cx<--cx-1;若cx=0,循环,否则顺序执行
loopz/loope label ;cx<--cx-1;若cx=0且zf=1,循环,否则顺序执行
loopnz/loopne label ;cx<--cx-1;若cx=0且zf=0,循环,否则顺序执行
子程序调用指令,push ip,jmp...
call label ;段内调用,根据位移量寻址 push ip
call r16/m16 ;段内调用,根据寄存器寻址 push ip
call far ptr label ;段间调用,直接寻址 push cs,push ip
call far ptr mem ;段间调用,间接寻址 push cs,push ip
子程序返回指令,pop ip...
ret ;无参数段内返回,pop ip
ret i16 ;有参数返回,pop ip(sp<--sp-2),sp<--sp+i16
ret ;无参数段间返回,pop cs,pop ip
ret i16 ;有参数段间返回,pop cs,pop ip(sp<--sp+2),sp<--sp+i16
int i8 ;中断调用指令,产生i8号中断
iret ;中断返回指令,实现中断返回
into ;溢出中断指令,溢出标志OF=1,则产生4号中断,否则顺序执行
nop不执行任何有意义的操作,但占用1字节内存单元,空耗一个指令执行周期,常用于程序调试
格式:
seg:
如cs:,ss:,ds:,es: ;取代默认寄存器
在这个质量执行时间内,8086处理器的封锁引脚有效,即把总线封锁,使别的控制器不能控制总线,直到该指令执行完后,总线封锁解除
使CPU进入暂停状态,不进行任何操作。当CPU发生复位或来自外部的中断时,CPU脱离暂停状态
ESC把浮点指令交给浮点处理器执行
esc 6位立即数,reg/mem
wait在8086的测试输入引脚为高电平无效时,使CPU进入等待状态,这时CPU不做任何操作;测试为低电平有效时,CPU脱离等待状态,继续执行后面的指令