X86指令详解.docx
《X86指令详解.docx》由会员分享,可在线阅读,更多相关《X86指令详解.docx(61页珍藏版)》请在冰豆网上搜索。
![X86指令详解.docx](https://file1.bdocx.com/fileroot1/2023-2/6/827a6067-a12e-4e5a-ae78-6dfd1b6e8b06/827a6067-a12e-4e5a-ae78-6dfd1b6e8b061.gif)
X86指令详解
X86指令详解
80x86指令系统
80x86指令系统,指令按功能可分为以下七个部分。
(1)数据传送指令。
(2)算术运算指令。
(3)逻辑运算指令。
(4)串操作指令。
(5)控制转移指令。
(6)处理器控制指令。
(7)保护方式指令。
3.3.1
数据传送指令包括:
通用数据传送指令、地址传送指令、标志寄存器传送指令、符号扩
展指令、扩展传送指令等。
一、通用数据传送指令
1传送指令
传送指令是使用最频繁的指令,格式:
MOVDEST,SRC
功能:
把一个字节,字或双字从源操作数SRC传送至目的操作数DEST。
传送指令允许的数据流方向见图3。
3.11
由上图可知,数据允许流动方向为:
通用寄存器之间、通用寄存器和存储器之间、
通用寄存器和段寄存器之间、段寄存器和存储器之间,另外还允许立即数传送至通用寄存器
或存储器。
但在上述传送过程中,段寄存器CS的值不能用传送指令改变。
3.12CPU内部寄存器之间的数据传送。
MOVAL,DH;AL?
DH(8位)
MOVDS,AX;DS?
AX(16位)
MOVEAX,ESI;EAX?
ESI(32位)
3.13CPU内部寄存器和存储器之间的数据传送。
MOV[BX],AX;间接寻址(16位)
MOVEAX,[EBX+ESI];基址变址寻址(32位)
MOVAL,BLOCK;BLOCK为变量名,直接寻址(8位)
3.14立即数送通用寄存器、存储器。
MOVEAX,12345678H;EAX?
12345678H(32位)
MOV[BX],12H;间接寻址(8位)
MOVAX,1234H;AX?
1234H(16位)
使用该指令应注意以下问题:
?
源和目的操作数不允许同时为存储器操作数;
?
源和目的操作数数据类型必须一致;
?
源和目的操作数不允许同时为段寄存器;
?
目的操作数不允许为CS和立即数;
?
当源操作数为立即数时,目的操作数不允许为段寄存器;
?
传送操作不影响标志位。
2扩展传送指令
格式:
MOVSXDEST,SRC
MOVZXDEST,SRC
功能:
将源操作数由8位扩展到16位送目的操作数,或由16位扩展到32位送目的
操作数。
其中MOVSX是按有符号数扩展,MOVZX是按无符号数扩展。
无符号数或正数高位扩展为0,负数高位扩展为全“1”。
3.15带符号数扩展
MOVBL,80H;-128
MOVSXAX,BL;将80H扩展为FF80H后送AX中。
3.16无符号数扩展
MOVBL,80H;128
MOVZXAX,BL;将80H扩展为0080H后送AX中。
使用该指令应注意以下问题:
?
目的操作数应为16位或32位通用寄存器;
?
源操作数长度须小于目的操作数长度,为8位或16位通用寄存器或存储器操作数;
?
扩展传送操作不影响标志位。
3交换指令
(1)格式:
XCHGOPR1,OPR2
功能:
交换操作数OPR1和OPR2的值,操作数数据类型为字节、字或双字。
允许通
用寄存器之间,通用寄存器和存储器之间交换数据。
3.17
XCHGAX,BX;通用寄存器之间交换数据(16位)
XCHGESI,EDI;通用寄存器之间交换数据(32位)
XCHGBX,\[SI\];通用寄存器和存储器之间交换数据(16位)
XCHGAL,\[BX\];通用寄存器和存储器之间交换数据(8位)
使用该指令应注意以下问题:
?
操作数OPR1和OPR2不允许同为存储器操作数;
?
操作数数据类型必须一致;
?
交换指令不影响标志位。
如要实现存储器操作数交换,可用如下指令实现:
MOVAL,BLOCK1
XCHGAL,BLOCK2
MOVBLOCK1,AL
(2)格式:
BSWAPREG
功能:
将32位通用寄存器中,第1个字节和第4个字节交换,第2个字节和第3个字节交换。
3.18
MOVEAX,44332211H
BSWAPEAX;EAX=11223344H
使用该指令应注意以下问题:
?
操作数为32位通用寄存器;
?
交换指令不影响标志位。
二、堆栈操作指令
1压栈指令
(1)格式:
PUSHSRC
功能:
将源操作数压下堆栈,源操作数允许为16位或32位通用寄存器、存储器和立即数以及16位段寄存器。
当操作数数据类型为字类型,压栈操作使SP值减2;当数据类型为双字类型,压栈操作使SP值减4。
3.19
PUSHAX;通用寄存器操作数入栈(16位)
PUSHEBX;通用寄存器操作数入栈(32位)
PUSH[SI];存储器操作数入栈(16位)
PUSHDWORDPTR[DI];存储器操作数入栈(32位)
PUSHW0A123H;立即数入栈(16位)
PUSHD20H;立即数入栈(32位)
(2)格式:
PUSHA
PUSHAD
功能:
PUSHA将16位通用寄存器压入堆栈,压栈顺序为AX,CX,DX,BX,SP,
BP,SI,DI。
PUSHAD将32位通用寄存器压入堆栈,压栈顺序为EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI。
2出栈指令
(1)格式:
POPDEST
功能:
从栈顶弹出操作数送入目的操作数。
目的操作数允许为16或32位通用寄存器、存储器和16位段寄存器。
当操作数数据类型为字类型,出栈操作使SP加2;当操作数数据类型为双字类型,出栈操作使SP加4。
3.20
POPAX;操作数出栈送寄存器(16位)
POPECX;操作数出栈送寄存器(32位)
POP[BX];操作数出栈送存储器(16位)
POPDWORDPTR[SI];操作数出栈送存储器(32位)
(2)格式:
POPA
POPAD
功能:
POPA从堆栈移出16字节数据,并且按顺序存入寄存器DI,SI,BP,SP,B
X,DX,CX,AX中。
POPAD从堆栈移出32字节数据,并且按顺序存入寄存器EDI,ESI,EBP,ESP,E
BX,EDX,ECX,EAX中。
使用堆栈操作指令应注意以下问题。
(1)目的操作数不允许为CS以及立即数。
(2)堆栈操作指令不影响标志位。
三、地址传送指令
(1)格式:
LEAREG,MEM
功能:
将源操作数的有效地址传送到通用寄存器,操作数REG为16位或32位通用寄存器,源操作数为16位或32位存储器操作数。
3.21
LEABX,BLOCK;将BLOCK的有效地址传送到BX中(16位)
LEAEAX,\[EBX\];将EBX内容(有效地址)传送到EAX中(32位)
(2)格式LDS(ES,FS,GS,SS)REG,MEM
功能:
根据源操作数指定的偏移地址,在数据段中取出段地址和偏移地址分别送指定的
段寄存器和指定的通用寄存器。
3.22
LESBX,[SI];将32位地址指针分别送ES和BX
LSSEAX,[EDI];将48位地址指针分别送SS和EAX
3.23
DATA1DDbuff
LDSBX,DATA1;将buff的32位地址指针分别送DS和BX
地址传送指令对标志位无影响。
四、标志寄存器传送指令
(1)格式:
LAHF
SAHF
功能:
LAHF将标志寄存器中低8位送AH中。
SAHF将AH中内容送标志寄存器中低8位。
(2)格式:
PUSHF
POPF
功能:
PUSHF将标志寄存器低16位内容压入堆栈,SP?
SP-2。
POPF将当前栈顶一个字传送到标志寄存器低16位中,SP?
SP+2。
(3)格式:
PUSHFD
POPFD
功能:
PUSHFD将标志寄存器32位内容压入堆栈SP?
SP-4。
POPFD将当前栈顶一个双字传送到32位标志寄存器中,SP?
SP+4。
上述SAHF,POPF,POPFD均影响相应的标志寄存器内容。
五、查表指令
格式:
XLAT
功能:
将寄存器AL中的内容转换成存储器表格中的对应值。
实现直接查表功能。
XLAT指令规定:
BX寄存器存放表的首地址,AL寄存器中存放表内偏移量,执行XLAT指令,以段寄存器DS的内容为段基址,有效地址为BX和AL内容之和,取出表中一个字节内容送AL中。
3.24内存中有一起始地址为TABLE的编码表,试编程将表中顺序号为4的存储单元内容送寄存器AL。
?
MODELSMALL
?
DATA
TABLEDB11H,22H,33H,44H,55H某编码表
?
CODE
?
STARTUP
MOVAL,4;AL?
4
MOVBX,OFFSETTABLE;BX?
TABLE表首地址
XLAT;结果在AL中,AL=55H
?
EXIT
END
查表指令不影响标志位。
六、符号扩展指令
(1)格式:
CBW
功能:
将AL中8位带符号数,进行带符号扩展为16位,送AX中。
带符号扩展是指对正数高位扩展为全“0”,对负数高位扩展为全“1”。
3.25AL=55H经CBW扩展后AX=0055H
AL=A5H经CBW扩展后AX=FFA5H
(2)格式:
CWD
功能:
将AX中16位带符号数,进行带符号扩展为32位,送DX和AX中。
高16位送DX中,低16位送AX中。
(3)格式:
CWDE
功能:
将AX中16位带符号数,进行带符号扩展为32位,送EAX中。
(4)格式:
CDQ
功能:
将EAX中32位带符号数,进行带符号扩展为64位,送EDX和EAX中。
低32位送EAX中,高32位送EDX中。
符号扩展指令对标志位无影响。
3.3.2
80x86指令包括加、减、乘、除四种基本算术运算操作及十进制算术运算调整指令。
二进制加、减法指令,带符号操作数采用补码表示时,无符号数和带符号数据运算可以使用
相同的指令。
二进制乘、除法指令分带符号数和无符号数运算指令。
一、加法指令
格式:
ADDDEST,SRC
ADCDEST,SRC
功能:
ADD是将源操作数与目的操作数相加,结果传送到目的操作数。
ADC是将源操
作数与目的操作数以及CF(低位进位)值相加,结果传送到目的操作数。
源操作数可以是通用寄存器、存储器或立即数。
目的操作数可以是通用寄存器或存储器
操作数。
ADD,ADC指令影响标志位为OF,SF,ZF,AF,PF,CF。
3.26
MOVAX,9876H
ADDAH,AL;AX=0E76HCF=1SF=0OF=0ZF=0AF=0PF=0
ADCAH,AL;AX=8576HCF=0SF=1OF=1ZF=0AF=1PF=0
二、减法指令
格式:
SUBDEST,SRC
SBBDEST,SRC
功能:
SUB将目的操作数减源操作数,结果送目的操作数。
SBB将目的操作数减源操作数,还要减CF(低位借位)值,结果送目的操作数。
源操作数可以是通用寄存器、存储器或立即数。
目的操作数可以是通用寄存器或存储器
操作数。
SUB,SBB指令影响标志位为OF,SF,ZF,AF,PF,CF。
327
MOVAX,9966H;AX=9966H
SUBAL,80H;AL=E6HCF=1SF=1OF=1ZF=0AF=0PF=0
SBBAH,80H;AH=18HCF=0SF=0OF=0ZF=0AF=0PF=1
三、加1减1指令
格式:
INCDEST
DECDEST
功能:
INC指令将目的操作数加1,结果送目的操作数。
DEC指令将目的操作数减1,
结果送目的操作数。
目的操作数为通用寄存器或存储器操作数。
INC,DEC指令影响标志位为OF,SF,ZF,AF,PF。
328
INCBL;BL?
BL+1
INCAX;AX?
AX+1
INCWORDPTR[BX];存储器操作数加1
DECBYTEPTR[SI];存储器操作数减1
DECEAX;EAX?
EAX-1
四、比较指令
(1)格式:
CMPDEST,SRC
功能:
目的操作数减源操作数,结果不回送。
源操作数为通用寄存器、存储器和立即数。
目的操作数为通用寄存器、存储器操作数。
CMP指令影响标志位为OF,SF,ZF,AF,PF,CF。
329
CMPCX,3
CMPWORDPTR[SI],3
CMPAX,BLOCK
执行比较指令后,对状态标志位影响见表3.2。
对于两个数的比较(AX-BX)有以下3
种情况。
3.2CMP
?
两个正数比较,使用SF标志位判断。
SF=0,则AX?
BX,若ZF=1,则AX=BX
SF=1,则AX?
两个无符号数比较,使用CF标志位判断。
CF=0,则AX?
BX,若ZF=1,则AX=BX
CF=1,则AX?
两个负数比较,使用SF标志位判断。
SF=0,则AX?
BX,若ZF=1,则AX=BX
SF=1,则AX?
两个异符号数比较。
如果OF=0,仍可用SF标志判断大小。
如果OF=1,说明结果的符号位发生错误,所以
SF=0,则AXSF=1,则AX>BX
综上所述:
两个异号数比较
当OF=0,SF=0,则AX>BX
SF=1,则AX当OF=1,SF=0,则AXSF=1,则AX>BX
用逻辑表达式表示为:
若OF?
-SF=0,则AX>BX
若OF?
-SF=1,则AX(2)格式:
CMPXCHGDEST,REG
功能:
目的操作数减源操作数,
如果DEST=SRC,则SRC?
DEST。
如果DEST?
SRC,则DEST?
ACC(AL,AX,EAX)。
源操作数允许为通用寄存器。
目的操作数可以为通用寄存器,存储器操作数。
CMPXCHG影响标志位为OF,SF,ZF,AF,PF,CF。
(3)格式:
CMPXCHG8BMEM
功能:
EDX:
EAX中值减存储器操作数。
如果EDX:
EAX=MEM64,则ECX:
EBX?
MEM64。
如果EDX:
EAX?
MEM64,则MEM64?
EDX:
EAX。
该指令为64位比较交换指令,影响ZF标志位。
330CMPXCHG8BQWORDPTR[EBX]
五、交换相加指令
格式:
XADDDEST,REG
功能:
目的操作数加源操作数,结果送目的操作数。
原目的操作数内容送源操作数。
源
操作数允许为通用寄存器。
目的操作数允许为通用寄存器、存储器操作数。
XADD指令影响标志位为OF,SF,ZF,AF,PF,CF。
六、求补指令
格式:
NEGDEST
功能:
对目的操作数求补,用零减去目的操作数,结果送目的操作数。
目的操作数为通
用寄存器、存储器操作数。
NEG指令影响标志位为OF,SF,ZF,AF,PF,CF。
七、乘法指令
(1)格式:
MULSRC
IMULSRC
功能:
MUL为无符号数乘法指令,IMUL为带符号数乘法指令。
源操作数为通用寄存
器或存储器操作数。
目的操作数缺省存放在ACC(AL,AX,EAX)中,乘积存AX,DX:
A
X,EDX:
EAX中。
字节乘:
AL?
AX
字乘:
AX?
DX?
AX
双字乘:
EAX?
EDX?
EAX
MUL,IMUL指令执行后,CF=OF=0,表示乘积高位无有效数据;CF=OF=1表示乘积高位含有效数据,对其它标志位无定义。
331
MULBL;字节乘
MULWORDPTR[SI];字乘
IMULBYTEPTR[DI];字节乘
IMULDWORDPTR[ECX];双字乘
如果使用IMUL指令,积采用补码形式表示。
(2)格式:
IMULDEST,SRC
功能:
将目的操作数乘以源操作数,结果送目的操作数。
目的操作数为16位或32位
通用寄存器或存储器操作数。
源操作数为16位或32位通用寄存器、存储器或立即数。
源操作数和目的操作数数据类型要求一致。
乘积仅取和目的操作数相同的位数,高位部
分将被舍去,并且CF=OF=1。
其它标志位无定义。
(3)格式:
IMULDEST,SRC1,SRC2
功能:
将源操作数SRC1与源操作数SRC2相乘,结果送目的操作数。
目的操作数D
EST为16位或32位,允许为通用寄存器。
源操作数SRC1为16位或32位通用寄存器或存储器操作数。
源操作数SRC2允许为立即数。
332IMULEAX,[EBX],12H
要求目的操作数和源操作数SRC1类型相同,当乘积超出目的操作数部分,将被舍去,
并且使CF=OF=1,在使用这类指令时,需在IMUL指令后加一条判断溢出的指令,溢出
时转错误处理执行程序。
八、除法指令
格式:
DIVSRC
IDIVSRC
功能:
DIV为无符号数除法,IDIV为带符号数除法。
源操作数作为除数,为通用寄存
器或存储器操作数。
被除数缺省在目的操作数AX,DX:
AX,EDX:
EAX中。
字节除法:
AX/SRC商?
AL,余数?
AH
字除法:
DX?
AX/SRC商?
AX,余数?
DX
双字除法:
EDX?
EAX/SRC商?
EAX,余数?
EDX
由于被除数必须是除数的双倍字长,一般应使用扩展指令进行高位扩展。
当进行无符号
数除法时,被除数高位按0扩展为双倍除数字长。
当进行有符号数除法时,被除数以补码
表示。
可使用扩展指令CBW,CWD,CWDE,CDQ进行高位扩展。
例如:
MOVAX,BLOCK
CWD;被除数高位扩展
MOVBX,1000H
IDIVBX
对于带符号除法,其商和余数均采用补码形式表示,余数与被除数同符号。
当除数为零
或商超过了规定数据类型所能表示的范围时,将会出现溢出现象,产生一个中断类型码为
“0”的中断。
执行除法指令后标志位无定义。
九、BCD算术运算
十进制数在机器中采用BCD码表示,以压缩格式存放,即一个字节存储2位BCD码,BCD加减法是在二进制加减运算的基础上,对其二进制结果进行调整,将结果调整成BCD码表示形式。
(1)格式:
DAA
功能:
将存放在AL中的二进制和数,调整为压缩格式的BCD码表示形式。
调整方法:
若AL中低4位大于9或标志AF=1(表示低4位向高4位有进位),则
AL+6?
AL,1?
AF,
若AL中高4位大于9,或标志CF=1,(表示高4位有进位),则
AL+60H?
AL,1?
CF,
DAA指令一般紧跟在ADD或ADC指令之后使用,影响标志位为SF,ZF,AF,PF,CF。
OF无定义。
333
ADDAL,BL
DAA
(2)格式:
DAS
功能:
将存放在AL中的二进制差数,调整为压缩的BCD码表示形式。
调整方法:
若AL中低4位大于9或标志AF=1(表示低4位向高位借位),则
AL-6?
AL,1?
AF
若AL中高4位大于9或标志CF=1(表示高4位向高位借位),则
AL-60H?
AL,1?
CF
DAS指令一般紧跟在SUB或SBB指令之后使用,影响标志位为SF,ZF,AF,PF,CF。
OF无定义。
334
SUBAL,BL
DAS
十、ASCII算术运算
数字0~9的ASCII码为30H~39H,机器采用一个字节存放一位ASCII码,对于ASCII码的算术运算是在二进制运算基础上进行调整。
调整指令有加、减、乘、除四种调整
指令。
(1)格式:
AAA
功能:
将存放在AL中的二进制和数,调整为ASCII码表示的结果。
调整方法:
若AL中低4位小于或等于9,仅AL中高4位清0,AF?
CF。
若AL中低4位大于9或标志AF=1(进位),则AL+6?
AL,AH+1?
AH,1?
AF,AF?
CF,AL中高4位清0。
AAA指令一般紧跟在ADD或ADC指令之后使用,影响标志位为AF,CF。
其它标志位无定义。
335
MOVAX,0036H
ADD,AL,35H
AAA;AX=0101H
(2)格式:
AAS
功能:
将存放在AL中的二进制差数,调整为ASCII码表示形式
调整方法:
若AL中低4位小于等于9,仅AL中高4位清0,AF?
CF。
若AL中低4位大于9或标志AF=1,则AL-6?
AL,AH-1?
AH,1?
AF,AF?
CF,AL中高4位清0。
AAS指令一般紧跟在SUB,SBB指令之后使用,影响标志位为AF,CF。
其它标志位无定义。
336
MOVAX,0132H
SUBAL,35H
AAS;AX=0007H
(3)格式:
AAM
功能:
将存放在AL中的二进制积数,调整为ASCII码表示形式。
调整方法:
AL/10商?
AH,余数?
AL
AAM指令一般紧跟在MUL指令之后使用,影响标志位为SF,ZF,PF。
其它标志位无定义。
337
MOVAL,07H
MOVBL,09H
MULBL;AX=003FH
AAM;AX=0603H
(4)格式:
AAD
功能:
将AX中两位非压缩BCD码(一个字节存放一位BCD码),转换为二进制数的表示形式。
调整方法:
AH?
AL0?
AH
AAD指令用于二进制除法DIV操作之前,影响的标志位为SF,ZF,PF。
其它标志位无定义。
338
MOVAX,0605H
MOVBL,09H
AAD;AX=0041H
DIVBL;AX=0207H
使用该类指令应注意,加法、减法和乘法调整指令都是紧跟在算术运算指令之后,将二
进制的运算结果调整为非压缩BCD码表示形式,而除法调整指令必须放在除法指令之前进
行,以避免除法出现错误的结果。
使用算术运算类指令应注意:
?
如果没有特别规定,参与运算的两个操作数数据类型必须一致,且只允许一个为存储
器操作数;
?
如果参与运算的操作数只有一个,且为存储器操作数,必须使用PTR伪指令说明数据类型;
?
操作数不允许为段寄存器。
?
目的操作数不允许为立即数;
?
如果是存储器寻址,则存储器各种寻址方式均可使用。
333
一、逻辑指令
1逻辑与指令
格式:
ANDDEST,SRC
功能:
目的操作数和源操作数按位进行逻辑与运算,结果存目的操作数中。
源操作数可
以是通用寄存器、存储器或立即数。
目的操作数可以是通用寄存器或存储器操作数。
339
ANDAL,BL
ANDEBX,ECX
AND[DI],1101H
AND指令常用于将操作数中某位清0(称屏蔽),只须将要清0的位与0,其它不变的位与1即可。
340ANDAL,0FH;将AL中高4位清0,低4位保持不变。
AND指令影响标志位为SF,ZF,PF,并且使OF=CF=0。
2逻辑或指令
格式:
ORDEST,SRC
功能:
目的操作数和源操作数按位进行逻辑或运算,结果存目的操作数中。
源操作数可
以是通用寄存器、存储器或立即数。
目的操作数可