80×86汇编常用指令

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 释放堆栈帧
上一篇:Java学习86


下一篇:[LeetCode题解]86. 分隔链表 | 三指针 + 虚拟头节点