X86指令详解.docx

上传人:b****8 文档编号:9886021 上传时间:2023-02-07 格式:DOCX 页数:61 大小:276.29KB
下载 相关 举报
X86指令详解.docx_第1页
第1页 / 共61页
X86指令详解.docx_第2页
第2页 / 共61页
X86指令详解.docx_第3页
第3页 / 共61页
X86指令详解.docx_第4页
第4页 / 共61页
X86指令详解.docx_第5页
第5页 / 共61页
点击查看更多>>
下载资源
资源描述

X86指令详解.docx

《X86指令详解.docx》由会员分享,可在线阅读,更多相关《X86指令详解.docx(61页珍藏版)》请在冰豆网上搜索。

X86指令详解.docx

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,则AX

SF=1,则AX>BX

综上所述:

两个异号数比较

当OF=0,SF=0,则AX>BX

SF=1,则AX

当OF=1,SF=0,则AX

SF=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

功能:

目的操作数和源操作数按位进行逻辑或运算,结果存目的操作数中。

源操作数可

以是通用寄存器、存储器或立即数。

目的操作数可

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1