x86架构作为个人计算机和服务器领域的主流计算架构,其汇编语言是理解计算机底层运行机制、进行逆向工程、性能优化及嵌入式开发的核心基础。本文将系统梳理x86架构中的常用寄存器​和常用汇编指令​,并结合实际应用场景说明其作用。

x86常用寄存器(Registers)

寄存器是CPU内部的高速存储单元,用于临时存放数据、地址或控制信息。x86寄存器按功能可分为通用寄存器、段寄存器、标志寄存器、指令指针、控制寄存器、调试寄存器及浮点/SIMD寄存器等类别。

通用寄存器(General-Purpose Registers, GPRs)

通用寄存器是最常用的寄存器,支持数据存储、算术运算、内存寻址及栈操作等功能。根据架构位宽(16/32/64位)扩展,以下为核心寄存器:

32位通用寄存器(EAX-EBP/ESP)

缩写 英文全程 功能描述
EAX Extended Accumulator Reister 累加器,用于算术运算(如ADD、MUL)、函数返回值存储(如C语言eax存返回值);高16位为AX,低8位AL,高8位AH。
EBX Extended Base Register 基址寄存器,常用作内存访问的基地址(如数组索引),支持相对寻址([ebx+offset]);高16位BX,低8位BL,高8位BH。
ECX Extended Counter Register 计数器,用于循环计数(如LOOP指令自动递减ECX)或字符串操作重复次数(REP MOVSB);高16位CX,低8位CL(位移量常用)。
EDX Extended Data Register 数据寄存器,与EAX配合完成大数运算(如32位MUL EDX:EAX得64位结果);高16位DX,低8位DL,高8位DH。
ESI Extended Source Index Register 源变址寄存器
EDI Extended Distination Index Register 目的变址寄存器
EBP Extended Base Pointer Register 基指针寄存器,指向当前栈帧基地址([ebp+8]访问函数第一个参数);高16位BP,无8位模式。
ESP Extended Stack Pointer Register 栈指针寄存器,指向当前栈顶地址,随PUSH/POP/CALL自动调整;高16位SP,无8位模式。

64位通用寄存器(RAX-R15)

x86-64(AMD64)扩展了8个64位寄存器(RAX-RDI)及新增8个(R8-R15),低32位兼容32位寄存器:

缩写 功能描述
RAX ~ RDI 64位版本,低32位为EAX-EDI,用于64位运算或存储更大范围数据。
R8 ~ R15 新增寄存器,低32位为R8D-R15D,常用于64位模式函数参数传递(如Linux 64位前6个参数用RDI/RSI/RDX/RCX/R8/R9)。

段寄存器(Segment Registers)

段寄存器存储内存段的基地址或选择子,在实模式和保护模式下作用不同:

实模式(16位,如DOS)

通过“段地址×16 + 偏移地址”计算20位物理地址:

保护模式/长模式(32/64位)

存储段选择子(16位),指向全局描述符表(GDT)/局部描述符表(LDT)中的段描述符:

缩写 英文全程 功能描述
CS Code Segment Register 代码段寄存器
DS Data Segment Register 数据段寄存器
ES Extra Segment Register 附加段寄存器
SS Stack Segment Register 栈段寄存器
FS 无严格全称
GS 无严格全称

标志寄存器(Flags Registers)

记录运算状态或控制CPU行为,32位为EFLAGS,64位为RFLAGS(低32位兼容EFLAGS)。

缩写 英文全程 功能描述
CF Carry Flag 进位标志
PF Parity Flag 奇偶标志,结果低8位中1的个数为偶数时置1(用于校验)
AF Auxiliary Carry Flag 辅助进位标志
ZF Zero Flag 运算结果为0时置1(如CMP EAX, EBX后ZF=1,表示EAX==EBX)
SF Sign Flag 结果最高位(符号位)为1时置1(表示负数)
TF Trap Flag 置1时CPU进入单步调试模式(每条指令后触发中断)
IF Interrupt Enable Flag 置1时允许外部可屏蔽中断(INTR)
DF Direction Flag 控制字符串操作指针增减(CLD清零→递增;STD置1→递减)
OF Overflow Flag 有符号运算溢出(如8位加法结果超-128~127)

指令指针寄存器(Instruction Pointer Registers)

缩写 英文全称 功能描述
EIP Extended Instruction Pointer 32位指令指针,存储下一条要执行的指令地址(程序计数器)。
RIP Instruction Pointer (64-bit) 64位指令指针,存储下一条指令地址(R表示64位扩展)。

x86常用汇编指令(Instructions)

指令按功能分为数据传输、算术运算、逻辑操作、移位、比较与跳转等类别。多数指令会修改标志寄存器(如CF、ZF),少数例外(如PUSHF)。

数据传输指令(Data Transfer Instructions)

功能​:寄存器、内存或I/O端口间数据移动,​通常不影响标志寄存器。

指令缩写 英文全称 功能描述 影响标志
MOV Move 寄存器/内存与寄存器/立即数传数据(如MOV EAX, 1)。
XCHG Exchange 交换两个寄存器或寄存器与内存内容(如XCHG EAX, EBX)。
PUSH Push onto Stack 操作数压入栈(ESP/SP递减,如PUSH EAX)。 无(除非操作数是标志寄存器)
POP Pop from Stack 从栈顶弹出数据到操作数(ESP/SP递增,如POP EBX)。 无(除非操作数是标志寄存器)
LEA Load Effective Address 加载有效地址到寄存器(计算地址但不访问内存,如LEA EAX, [EBX+4])。
PUSHF(Push Flags) Push Flags onto Stack 将标志寄存器(EFLAGS/RFLAGS)压栈(如PUSHF)。
POPF(Pop Flags) Pop Flags from Stack 从栈弹出数据到标志寄存器(直接修改所有标志,慎用!如POPF)。 修改所有标志

算术运算指令(Arithmetic Instructions)

功能:加减乘除或带进位运算,显著修改状态标志(CF、ZF、OF等)。

指令缩写 英文全称 功能描述 影响标志
ADD Add 加法(dst = dst + src,如ADD EAX, EBX)。 CF、ZF、OF、SF、PF、AF
SUB Subtract 减法(dst = dst - src,如SUB ECX, 10)。 同ADD
ADC Add with Carry 带进位加法(dst = dst + src + CF,如ADC EDX, EAX)。 同ADD
INC Increment 加1(dst = dst + 1,如INC ESI)。 ZF、OF、SF、PF(不影响CF
MUL Unsigned Multiply 无符号乘法(ALr/m8→AX;EAXr/m32→EDX:EAX)。 CF=1或OF=1(结果超寄存器宽度时置1,否则清零);其他标志无定义
DIV Unsigned Divide 无符号除法(被除数在AX/EDX:EAX,商→AL/EAX,余数→AH/EDX)。 除数为0或商溢出时触发#DE异常;标志无定义

逻辑操作指令(Logical Instructions)

功能:按位与、或、异或等操作,影响ZF、SF、PF,清除CF/OF

指令缩写 英文全称 功能描述 影响标志
AND And 按位与(dst = dst & src,如AND EDX, 0xFF)。 ZF、SF、PF;CF=0,OF=0
OR Or 按位或(dst = dst | src,如OR EAX, 1)。 同AND
XOR Exclusive Or 按位异或(dst = dst ^ src,如XOR ECX, ECX清零ECX)。 同AND
TEST Test 测试位(dst & src,不保存结果,如TEST EAX, 0x80检查最高位)。 同AND

移位与循环移位指令(Shift & Rotate Instructions)

功能:左移、右移或循环移位,影响CF、OF(单次移位)或ZF、SF、PF(多次移位)

指令缩写 英文全称 功能描述 影响标志
SHL Shift Left Logical 逻辑左移(高位丢弃,低位补0,如SHL EAX, 1)。 单次:CF=移出的最高位;ZF/SF/PF;OF=符号位是否改变
多次:CF=最后移出的位;OF无定义
SHR Shift Right Logical 逻辑右移(低位丢弃,高位补0,如SHR EBX, 2)。 同SHL
SAR Shift Right Arithmetic 算术右移(低位丢弃,高位补符号位,如SAR ECX, 1保持符号)。 同SHL
ROL Rotate Left 循环左移(高位移到低位,如ROL EDX, 3)。 单次:CF=移出的最高位;
多次:CF=最后移出的位;OF无定义
RCL Rotate Left with Carry 带进位循环左移(CF参与,最高位→CF→最低位,如RCL EAX, 1)。 单次:CF=移出的最高位;
多次:CF=最后移出的位;OF无定义

比较与条件跳转指令(Compare & Conditional Jump Instructions)

CMPTEST通过隐含减法/与操作设置标志,供条件跳转判断。

指令缩写 英文全称 功能描述 影响标志/依赖标志
CMP Compare 比较(dst - src,如CMP EAX, EBX),
等价于 SUB dst, src(不保存结果),
通过设置标志寄存器反映大小关系。
dst == src时,​ZF=1
dst > src时,ZF=0 CF=0 SF=0
dst < src时,ZF=0 CF=1 SF=1
JE/JZ Jump if Equal/Zero ZF=1(dst == src,或运算结果为0) 相等/为零时跳转(如 CMP EAX, EBXJE Label 表示 EAX=EBX 时跳转)
JNE/JNZ Jump if Not Equal/Not Zero ZF=0(dst != src,或运算结果非0) 不相等/非零时跳转
JG/JNLE Jump if Greater/Not Less or Equal ZF=0 且 SF=OF(有符号比较:dst > src,不包括等于) 有符号大于时跳转(如 CMP EAX, EBXJG Label 表示 EAX>EBX 时跳转)
JGE Jump if Greater or Equal SF=OF(有符号比较:dst ≥ src,包括等于) 有符号大于等于时跳转(dst == src 时 ZF=1,仍满足 SF=OF)
JL Jump if Less SF≠OF(有符号比较:dst < src 有符号小于时跳转
JLE Jump if Less or Equal ZF=1 或 SF!=OF(有符号比较:dst ≤ src,包括等于) 有符号小于等于时跳转
JB/JC Jump if Below/Jump if Carry CF=1(无符号比较:dst < src,或减法产生借位) 无符号小于时跳转(如 CMP AL, BLJB Label 表示 AL<BL 时跳转)
JAE/JNB Jump if Above or Equal/Jump if Not Below CF=0(无符号比较:dst ≥ src,或减法无借位) 无符号大于等于时跳转
JA Jump if Above CF=0 且 ZF=0(无符号比较:dst > src 无符号大于时跳转
CALL Call Procedure 无(压返回地址到栈,跳转到子程序) 调用子函数(如 CALL Func
RET Return 无(弹出栈顶返回地址,返回调用处) 子函数返回

完整的指令文档可以参考:https://shell-storm.org/x86doc/