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)
CMP和TEST通过隐含减法/与操作设置标志,供条件跳转判断。
| 指令缩写 | 英文全称 | 功能描述 | 影响标志/依赖标志 |
|---|---|---|---|
| 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, EBX 后 JE 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, EBX 后 JG 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, BL 后 JB 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/