80×86汇编常用指令
一.数据传送指令
1. 通用数据传送指令
简写 | 英文全称 | 执行操作 |
---|---|---|
MOV | move | 传送 |
MOVSX | move with sign-extend | 带符号扩展传送 |
MOVZX | move with zero-extend | 带零扩展传送 |
PUSH | push onto the stack | 进栈 |
POP | pop from the stack | 出栈 |
PUSHA/PUSHAD | push all registers | 所有寄存器进栈 |
POPA/POPAD | pop all registers | 所有寄存器出栈 |
XCHG | exchange | 交换 |
MOV传送指令
格式:MOV DST, SRC
执行操作: (DST)←(SRC)
其中DST表示目的操作数,SRC表示源操作数
具体形式:
格式 | 具体操作 |
---|---|
MOV mem/reg1,mem/reg2 | 两个操作数中有一个为寄存器(不能为段寄存器),另个一为存储器 |
MOV reg , data | reg指定寄存器(不能为段寄存器),data为立即数 |
MOV ac,mem | ac为累加器 |
MOV mem,ac | |
MOV segreg,mem/reg | segreg指定段寄存器,不能使用CS寄存器,执行完这条指令后不中断 |
MOV mem/reg,segreg | |
MOV mem/reg,data |
PUSH出栈指令
格式:POP DST
执行操作:16位指令: (DST)←((SP)+1,(SP))
(SP)←(SP)+2
32位指令: (DST)←((ESP)+3,(ESP)+2,(ESP)+1,(ESP))
(ESP)←(ESP)+4
PUSH | POP |
---|---|
PUSH reg | POP reg |
PUSH mem | POP mem |
PUSH segreg | POP segreg |
PUSH data | POP不允许立即数寻址方式 |
PUSHA/PUSHAD所有寄存器进栈指令
格式:PUSHA
PUSHAD
执行操作:
PUSHA:16位通用寄存器依次进栈,进栈次序为AX,DX,CX,BX,指令执行前的SP,BP,SI,DI。指令执行后(SP)←(SP)-16仍指向栈顶
PUSHAD:32位通用寄存器依次进栈,进栈次序为EAX,ECX,EDX,EBX,指令执行前的ESP,EBP,ESI,EDI。指令执行后(SP)←(SP)-32
POPA/POPAD所有寄存器出栈指令
格式:POPA
POPAD
执行操作:
POPA:16位通用寄存器依次出栈,出栈次序为DI,SI,BP,SP,BX,DX,CX,AX,指令执行后(SP)←(SP)+16仍指向栈顶,注:SP的出栈只是修改了指针使其后的BX能顺利出栈,而堆栈中原先由PUSHA指令存入的SP的原始内容被丢弃,并未真正送到SP寄存器中
POPAD:32位通用寄存器依次出栈,出栈次序为EDI,ESI,EBP,ESP,EBX,EDX,EAX。指令执行后(ESP)←(ESP)+32仍指向栈顶。与POPA相同,堆栈中存放的原ESP的内容被丢弃而不装入ESP寄存器
XCHG交换指令
格式为:XCHG OPR1,OPR2
执行操作:(OPR1)←→(OPR2)
2.累加器专用传送指令
IN输入指令
长格式为: IN AL,PORT(字节)
IN AX,PORT(字)
IN EAX,PORT(双字)
执行的操作: (AL)←(PORT)(字节)
(AX)←(PORT+1,PORT)(字)
(EAX)←(PORT+3,PORT+2,PORT+1,PORT)(双字)
短格式为: IN AL,DX(字节)
IN AX,DX(字)
IN EAX,DX(双字)
执行的操作: (AL)←((DX))(字节)
OUT输出指令
长格式为: OUT PORT,AL(字节)
OUT PORT,AX(字)
OUT PORT,EAX(双字)
执行的操作: (PORT)←(AL)(字节)
(PORT+1,PORT)←(AX)(字)
(PORT+3,PORT+2,PORT+1,PORT)←(EAX)(双字)
短格式为: OUT DX,AL(字节)
OUT DX,AX(字)
OUT DX,EAX(双字)
执行的操作: ((DX))←(AL)(字节)
((DX+1,DX))←(AX)(字)
((DX)+3,(DX)+2,(DX)+1,(DX))←(EAX)(双字)
XLAT换码指令
格式: XLAT OPR
或XLAT
执行的操作:
16位指令: (AL)←((BX)+(AL))
32位指令: (AL)←((EBX)+(AL))
3.地址传送指令
简写 | 英文全称 | 执行操作 |
---|---|---|
LEA | load effective address | 有效地址送寄存器 |
LDS | load DS with pointer | 指针送寄存器和DS |
LES | load ES with pointer | 指针送寄存器和ES |
LFS | load FS with pointer | 指针送寄存器和FS |
LGS | load GS with pointer | 指针送寄存器和GS |
LSS | load SS with pointer | 指针送寄存器和SS |
LEA有效地址送寄存器
格式: LEA REG,SRC
执行操作: (REG)←SRC
指令把源操作数的有效地址送到指定的寄存器中
LDS,LES,LFS,LGS,LSS指针送寄存器和段寄存器指令
格式以LDS为例: LDS REG,SRC
执行的操作: (REG)←(SRC)
(SREG)←(SRC+2)(16位)
或 (SREG)←(SRC+4)(32位)
指令把该存储单元里的偏移地址(SRC)装入给寄存器,然后把(SRC+2)或(SRC+4)中的数装入指定的段寄存器
4.标志寄存器传送指令
简写 | 英文全称 | 执行操作 |
---|---|---|
LAHF | load AH with flags | 标志送AH |
SAHF | store AH into flags | AH送标志寄存器 |
PUSHF/PUSHFD | push the flags or eflags | 标志进栈 |
POPF/POPFD | pop the flags of eflags | 标志出栈 |
5.类型转换指令
简写 | 英文全称 | 执行操作 | 格式 |
---|---|---|---|
CBW | convert byte to word | 字节转换为字 | CBW |
CWD | convert word to double word | 字转换为双字 | CWD |
CDQ | convert double to quad | 双字转换为4字 | CWDE |
BSWAP | byte swap | 字节交换(14交换,23交换) | BSWAP r32(32位寄存器) |
二.算术指令
1.加法指令
简写 | 英文全称 | 执行操作 |
---|---|---|
ADD | add | 加法 |
ADC | add with carry | 带进位加法 |
INC | increment | 加1 |
XADD | exchange and add | 交换并相加 |
2.减法指令
简写 | 英文全称 | 执行操作 |
---|---|---|
SUB | subtract | 减法 |
SBB | subtract with borrow | 带借位减法 |
DEC | decrement | 减1 |
NEG | negate | 求补 |
CMP | compare | 比较 |
CMPXCHG | compare and change | 比较并交换 |
CMPXCHG8B | compare and exchange 8 byte | 比较并交换8字节 |
3.乘法指令
简写 | 英文全称 | 执行操作 |
---|---|---|
MUL | unsigned multiple | 无符号数乘法 |
IMUL | signed multiple | 有符号数乘法 |
4.除法指令
简写 | 英文全称 | 执行操作 |
---|---|---|
DIV | unsigned divide | 无符号数除法 |
IDIV | divide | 有符号数除法 |
5.十进制调整指令
三.逻辑指令
1.逻辑运算指令
简写 | 英文全称 | 执行操作 |
---|---|---|
AND | and | 逻辑与 |
OR | or | 逻辑或 |
NOT | not | 逻辑非 |
XOR | exclusive or | 异或 |
TEST | test | 测试 |
2.移位指令
简写 | 英文全称 | 执行操作 |
---|---|---|
SHL | shift logical left | 逻辑左移 |
SAL | shift arithmetic left | 算数左移 |
SHR | shift logical right | 逻辑右移 |
SAR | shift arithmetic right | 算术右移 |
ROL | rotate left | 循环左移 |
ROR | rotate right | 循环右移 |
RCL | rotate left through carry | 带进位循环左移 |
RCR | rotate right through carry | 带进位循环右移 |
SHLD | shift left double | 双精度左移 |
SHRD | shift right double | 双精度右移 |
四.串处理指令
简写 | 英文全称 | 执行操作 |
---|---|---|
MOVS | move string | 串传送 |
CMPS | compare string | 串比较 |
SCAS | scan string | 串扫描 |
LODS | load from string | 从串取 |
STOS | store in to string | 存入串 |
INS | input from port to string | 串输入 |
OUTS | output string to port | 串输出 |
与上述指令配合使用的前缀有:
简写 | 英文全称 | 执行操作 |
---|---|---|
REP | repeat | 重复 |
REPE/REPZ | repeat while equal/zero | 相等/为零则重复 |
REPNE/REPNZ | repeat while not equal/not zero | 不相等/不为零则重复 |
建立方向标志的指令
简写 | 英文全称 | 执行操作 |
---|---|---|
CLD | clear direction flag | 使DF=0,在执行串处理指令时可使地址自动增量 |
STD | set direction flag | 使DF=1,在执行串处理指令时可使地址自动减量 |
串处理指令大部分形式都有三种, 以MOVS为例,MOVS , MOVSB, MOVSW
五.控制转移指令
1.无条件转移指令
JMP 跳转指令
2.条件转移指令
(1)根据单个条件标志的设置进行情况进行转移
简写 | 英文全称 | 执行操作 | 格式 | 测试条件 |
---|---|---|---|---|
JZ(或JE) | jump if zero,or equal | 结果为零(或相等)则转移 | JZ(或JE) OPR | ZF=1 |
JNZ(或JNE) | jump If not zero,or not equal | 结果不为零(或不相等)则转移 | JNZ(或JNE) OPR | ZF=0 |
JS | jump if sign | 结果为负则转移 | JS OPR | SF=1 |
JNS | jump if not sign | 结果为正则转移 | JNS OPR | SF=0 |
JO | jump if overflow | 溢出则转移 | JO OPR | OF=1 |
JNO | jump if not overflow | 不溢出则转移 | JNO OPR | OF=0 |
JP(或JPE) | jump if parity ,or parity even | 奇偶位为1则转移 | JP(或JPE) OPR | PF=1 |
JNP(或JPO) | jump If not parity,or parity odd | 奇偶位为0则转移 | JNP(或JPO) OPR | PF=0 |
JB(或JNAE,或JC) | jump if below, or not above or equal, or carry | 低于,或者不高于或等于,或进位为1则转移 | JB(或JNAE,或JC) OPR | CF=1 |
JNB(或JAE,或JNC) | jump if not below,or above or equal,or not carry | 不高于,或者高于或等于,或进位为零则转移 | JNB(或JAE,或JNC) OPR | CF=0 |
(2)比较两个无符号数,并根据比较的结果转移
简写 | 英文全称 | 执行操作 | 格式 | 测试条件 |
---|---|---|---|---|
JB(或JNAE,或JC) | jump if below,or not not above or equal,or carry | 低于,或者不高于或等于,或进位为1则转移 | JB(或JNAE,或JC) OPR | CF=1 |
JNB(或JAE,或JNC) | jump if not below ,or above or equal, or not carry | 不高于,或者高于或等于,或进位为零则转移 | JNB(或JAE,或JNC) OPR | CF=0 |
JBE(或JNA) | jump if below or equal,or not above | 低于等于,或不高于则转移 | JNBE(或JA) OPR | CF∪ZF=0 |
JNBE(或JA) | jump if not below or equal, or above | 不低于或等于,或高于则转移 | JNBE(或JA) OPR | CF∪ZF=1 |
(3)比较两个带符号数,并根据比较结果转移
简写 | 英文全称 | 执行操作 | 格式 | 测试条件 |
---|---|---|---|---|
JL(或JNGE) | jump if less,or not greater or equal | 小于,或者不大于或等于则转移 | JL(或JNGE) OPR | SF异或OF=1 |
JNL(或JGE) | jump if not less, or greater or equal | 不小于,或者大于或等于则转移 | JNL(或JGE) OPR | S异或OF=0 |
JLE(或JNG) | jump if less or equal,or not greater | 小于或等于,或者不大于则转移 | JLE(或JNG) OPR | (SF异或OF)∪ZF=1 |
JNLE(或JG) | jump if not less or equal, or greater | 不小于或等于,或者大于则转移 | JNLE(或JG) OPR | (SF异或OF)∪ZF=0 |
(4).测试CX或ECX的值为0则转移指令
简写 | 英文全称 | 执行操作 | 格式 | 测试条件 |
---|---|---|---|---|
JCXZ | jump if CX register is zero | CX寄存器的内容为零则转移 | JCXZ OPR | (CX)=0 |
3.条件设置指令(386)
4.循环指令
简写 | 英文全称 | 执行操作 | 格式 | 测试条件 |
---|---|---|---|---|
LOOP | loop | 循环 | LOOP OPR | (Count Reg)≠0 |
LOOPZ/LOOPE | loop while zero, or equal | 当为零或相等时循环 | LOOPZ(或LOOPE) OPR | ZF=1且(Count Reg)≠0 |
LOOPNZ/LOOPNE | loop while nonzero, or not equal | 当不为零或不相等时循环 | LOOPNZ(或LOOPNE) OPR | ZF=0且(Count Reg)≠0 |
其中的Count Reg为计数寄存器,16位指令用CX寄存器,32位指令用ECX寄存器
5.子程序(subroutine)
简写 | 英文全称 | 执行操作 | 格式 |
---|---|---|---|
CALL | call | 调用 | CALL DST |
RET | return | 返回 | RET或RET EXP |
6.中断
简写 | 英文全称 | 执行操作 | 格式 |
---|---|---|---|
INT | interrupt | 中断 | INT TYPE |
INTO | interrupt if overflow | 如溢出则中断 | INTO |
IRET/IRETD | return from interrupt | 从中断中返回 | IRET(IRETD) |
六.处理机控制与杂项操作指令
1.标志处理指令
简写 | 英文全称 | 执行操作 | 符号表述 |
---|---|---|---|
CLC | clear carry | 进位标志位置0 | CF←0 |
CMC | complement carry | 进位标志位求反 | CF← C F ‾ \overline{CF} CF |
STC | set carry | 进位位置1 | CF←1 |
CLD | clear direction | 方向标志位置0 | DF←0 |
STD | set direction | 方向标志位置1 | DF←1 |
CLI | clear interrupt | 中断标志置0 | IF←0 |
STI | set interrupt | 中断标志置1 | IF←1 |
2.其他处理机控制与杂项操作指令
简写 | 英文全称 | 执行操作 |
---|---|---|
NOP | no operation | 无操作 |
HLT | halt | 停机 |
ESC | escape | 换码 |
WAIT | wait | 等待 |
LOCK | lock | * |
BOUND | bound | 界限 |
ENTER | enter | 建立堆栈帧 |
LEAVE | leave | 释放堆栈帧 |