下面主要是 16/32 位指令,除了个别指令在64位机器上没有以外,其他的基本可以运用于64位机器。
指令符号说明
符号 |
说明 |
r8 |
任意一个8位通用寄存器 |
r16 |
任意一个16位通用寄存器 |
r32 |
任意一个32位通用寄存器 |
reg |
代表r8/r16/r32 |
seg |
段寄存器CS/DS/ES/SS和FS/GS |
m8 |
一个8位存储器操作数单元 |
m16 |
一个16位存储器操作数单元 |
m32 |
一个32位存储器操作数单元 |
mem |
代表m8/m16/m32 |
i8 |
一个8位立即数 |
i16 |
一个16位立即数 |
i32 |
一个32位立即数 |
imm |
代表i8/i16/i32 |
dest |
目的操作数 |
src |
源操作数 |
label |
标号 |
16/32位基本指令的汇编格式
指令类型 |
指令汇编格式 |
指令功能简介 |
传送指令 |
MOV reg/mem,imm |
dest <- src |
MOV reg/mem/seg,reg |
MOV reg/seg,mem |
MOV reg/mem,seg |
交换指令 |
XCHG reg,reg/mem |
reg <- -> reg/mem |
XCHG reg/mem,reg |
转换指令 |
XLAT buffer |
AL <- DS:[(E)BX + AL] |
XLAT |
注:buffer表示代码表所在的缓存区 |
堆栈指令 |
PUSH reg/mem/seg |
寄存器/存储器入栈 |
PUSH imm |
立即数入栈 |
POP reg/seg/mem |
出栈 |
PUSHA |
保护所有r16 |
POPA |
恢复所有r16 |
PUSHAD |
保护所有r32 |
POPAD |
恢复所有r32 |
标志位传送 |
LAHF |
AH <- FLAG低字节 |
SAHF |
FLAGS低字节 <- AH |
PUSHF |
FLAGS入栈 |
POPF |
FLAGS出栈 |
PUSHFD |
EFLAGS入栈 |
POPFD |
EFLAGS出栈 |
地址传送 |
LEA r16/r32,mem |
r16/r32 <- 16/32位有效地址 |
LDS r16/r32,mem |
DS:r16/r32 <- 32/64位远指针 |
LES r16/r32,mem |
ES:r16/r32 <- 32/64位远指针 |
LFS r16/r32,mem |
FS:r16/r32 <- 32/64位远指针 |
LGS r16/r32,mem |
GS:r16/r32 <- 32/64位远指针 |
LSS r16/r32,mem |
SS:r16/r32 <- 32/64位远指针 |
输入输出 |
IN AL/AX/EAX,i8/DX |
AL/AX/EAX <- I/O端口 i8/[DX] |
OUT i8/DX,AL/AX/EAX |
I/O端口 i8/[DX] <- AL/AX/EAX |
加法运算 |
ADD reg,imm/reg/mem |
dest <- dest + src |
ADD mem,imm/reg |
ADC reg,imm/reg/mem |
dest <- dest + src + CF |
ADC mem,imm/reg |
INC reg/mem |
reg/mem <- reg/mem + 1 |
减法运算 |
SUB reg,imm/reg/mem |
dest <- dest - src |
SUB mem,imm/reg |
SBB reg,imm/reg/mem |
dest <- dest - src - CF |
SBB mem,imm/reg |
DEC reg/mem |
reg/mem <- reg/mem - 1 |
NEG |
reg/mem <- (0 - reg/mem) |
CMP reg,imm/reg/mem |
dest <- src |
CMP mem,imm/reg |
乘法运算 |
MUL reg/mem |
无符号数值乘法 |
IMUL reg/mem |
有符号数值乘法 |
IMUL r16,r16/m16/i8/i16 |
r16 <- r16 x r16/m16/i8/i16 |
IMUL r16,r/m16,i8/i16 |
r16 <- r/m16 x i8/i16 |
IMUL r32,r32/m32/i8/i32 |
r32 <- r32 x r32/m32/i8/i32 |
IMUL r32,r/m32,i8/i32 |
r32 <- r32/m32 x i8/i32 |
|
DIV reg/mem |
无符号数值除法 |
IDIV reg/mem |
有符号数值除法 |
符号扩展 |
CBW |
把AL符号扩展为AX |
CWD |
把AX符号扩展为DX.AX |
CWDE |
把AX符号扩展为EAX |
CDQ |
把EAX符号扩展为EDX.EAX |
MOVSX r16,r8/m8 |
把 r8/m8 符号扩展并传送至r16 |
MOVSX r32,r8/m8/r16/m16 |
把 r8/m8/r16/m16 符号扩展并传送至r32 |
MOVZX r16,r8/m8 |
把 r8/m8 零位扩展并传送至 r16 |
MOVZX r32,r8/m8/r16/m16 |
把 r8/m8/r16/m16 零位扩展并传送至r32 |
十进制调整 |
DAA |
将 AL 中的加和调整为压缩BCD码 |
DAS |
将 AL 中的减差调整为压缩BCD码 |
AAA |
将 AL 中的加和调整为非压缩BCD码 |
AAS |
将 AL 中的减差调整为非压缩BCD码 |
AAM |
将 AX 中的加和调整为非压缩BCD码 |
AAD |
将 AX 中的非压缩BCD码扩展成二进制数 |
逻辑运算 |
AND reg,imm/reg/mem |
dest <- dest AND src |
AND mem,imm/reg |
OR reg,imm/reg/mem |
dest <- dest OR src |
OR mem,imm/reg |
XOR reg,imm/reg/mem |
dest <- dest XOR src |
XOR mem,imm/reg |
TEST reg,imm/reg/mem |
dest AND src |
TEST mem,imm/reg |
NOT reg/mem |
reg/mem <- NOT reg/mem |
移位 |
SAL reg/mem,1/CL/i8 |
算术左移 1/CL/i8 指定的位数 |
SAR reg/mem,1/CL/i8 |
算术右移 1/CL/i8 指定的位数 |
SHL reg/mem,1/CL/i8 |
与 SAL 相同 |
SHR reg/mem,1/CL/i8 |
逻辑右移 1/CL/i8 指定的位数 |
循环移位 |
ROL reg/mem,1/CL/i8 |
循环左移 1/CL/i8 指定的位数 |
ROR reg/mem,1/CL/i8 |
循环右移 1/CL/i8 指定的位数 |
RCR reg/mem,1/CL/i8 |
带进位循环左移 1/CL/i8 指定的位数 |
RCR reg/mem,1/CL/i8 |
带进位循环右移 1/CL/i8 指定的位数 |
串操作 |
MOVS[B/W/D] |
串传送 |
LODS[B/W/D] |
串读取 |
STOS[B/W/D] |
串储存 |
CMPS[B/W/D] |
串比较 |
SCAS[B/W/D] |
串扫描 |
INS[B/W/D] |
I/O 串输入 |
OUTS[B/W/D] |
I/O 串输出 |
REP |
重复前缀 |
REPZ/REPE |
相等重复前缀 |
REPNZ/REPNE |
不相等重复前缀 |
转移 |
JMP label |
无条件直接转移 |
JMP r16/r32/m16 |
无条件间接转移 |
JCC label |
条件转移 |
JCXZ label |
CX 等于 0 转移 |
JECXZ label |
ECX 等于 0 转移 |
循环 |
LOOP label |
(E)CX <- (E)CX - 1;若(E)CX != 0,循环 |
LOOPZ/LOOPE label |
(E)CX <- (E)CX - 1;若 (E)CX != 0 且 ZF = 1,循环 |
LOOPNZ/LOOPNE label |
(E)CX <- (E)CX - 1;若 (E)CX != 0 且 ZF = 0,循环 |
子程序 |
CALL label |
直接调用 |
CALL r16/m16 |
间接调用 |
RET |
无参数返回 |
RET i16 |
有参数返回 |
中断 |
INT i8 |
中断调用 |
IRET |
中断返回 |
INTO |
溢出中断调用 |
高级语言支持 |
ENTER i16/i8 |
建立堆栈帧 |
LEAVE |
释放堆栈帧 |
BOUND r16/r32,mem |
边界检测 |
处理器指令 |
CLC |
CF <- 0 |
STC |
CF <- 1 |
CMC |
CF <- ~CF |
CLD |
DF <- 0 |
STD |
DF <- 1 |
CLI |
IF <- 0 |
STI |
IF <- 1 |
NOP |
空操作指令 |
WAIT |
等待指令 |
HIL |
停机指令 |
LOCK |
封锁前缀 |
SEG |
段超越前缀 |
新增 32位 指令的汇编格式
双精度移位 |
SHLD r16/r32/ m16/m32, r16/r32, i8/CL |
将 r16/r32 的 i8/CL 位左移进入 r16/r32/ m16/m32 |
SHRD r16/r32/ m16/m32, r16/r32, i8/CL |
将 r16/r32 的 i8/CL 位右移进入 r16/r32/ m16/m32 |
位扫描 |
BSF r16/r32, r16/r32/ m16/m32 |
向前扫描 |
BSR r16/r32, r16/r32/ m16/m32 |
向后扫描 |
位测试 |
BT r16/r32, i8/r16/r32 |
测试位 |
BTC r16/r32, i8/r16/r32 |
测试位求反 |
BTR r16/r32, i8/r16/r32 |
测试位复位 |
BTS r16/r32, i8/r16/r32 |
测试位置位 |
条件设置 |
SETcc r8/m8 |
条件成立, r8/m8 = 1; 否则,r8/m8 = 0 |
系统寄存器传送 |
MOV CRn/DRn/TRn, r32 |
装入系统寄存器 |
MOV r32, CRn/DRn/TRn |
读取系统寄存器 |
多处理器 |
BSWAP r32 |
字节交换 |
XADD reg/mem,reg |
交换加 |
CMPXCHG reg/mem, reg |
比较交换 |
高速缓存 |
INVD |
高速缓存无效 |
WBINVD |
回写及高速缓存无效 |
INVLPG mem |
TLB 无效 |
Pentium 指令 |
CMPXCHG8B m64 |
8字节比较交换 |
CPUID |
返回处理器的有关特征信息 |
RDTSC |
EDX.EAX <- 64位时间标记计数器值 |
RDMSR |
EDX.EAX <- 模型专用寄存器值 |
WRMSR |
模型专用寄存器值 <- EDX.EAX |
RSM |
从系统管理方式返回 |
Pentium Pro 指令 |
CMOVcc r16/r32, r16/r32/ m16/m32 |
条件成立,r16/r32 <- r16/r32/ m16/m32 |
RDPMC |
EDX.EAX <- 40位性能监控计数器值 |
UD2 |
产生一个无效操作码异常 |