X86指令详解.docx
- 文档编号:9886021
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:61
- 大小:276.29KB
X86指令详解.docx
《X86指令详解.docx》由会员分享,可在线阅读,更多相关《X86指令详解.docx(61页珍藏版)》请在冰豆网上搜索。
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 功能: 目的操作数和源操作数按位进行逻辑或运算,结果存目的操作数中。 源操作数可 以是通用寄存器、存储器或立即数。 目的操作数可
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- X86 指令 详解
![提示](https://static.bdocx.com/images/bang_tan.gif)