x86架构常用寄存器及汇编指令
x86 架构作为个人计算机和服务器领域的主流计算架构,其汇编语言是理解计算机底层运行机制、进行逆向工程、性能优化及嵌入式开发的核心基础。本文将系统梳理 x86 架构中的常用寄存器 和常用汇编指令 ,并结合实际应用场景说明其作用。
x86 常用寄存器
寄存器是 CPU 内部的高速存储单元,用于临时存放数据、地址或控制信息。x86 寄存器按功能可分为通用寄存器、段寄存器、标志寄存器、指令指针、控制寄存器、调试寄存器及浮点/SIMD 寄存器等类别。
通用寄存器
(General-Purpose Registers, GPRs)
通用寄存器是最常用的寄存器,支持数据存储、算术运算、内存寻址及栈操作等功能。根据架构位宽(16/32/64 位)扩展,以下为核心寄存器:
32 位通用寄存器
| 缩写 | 英文全程 | 功能描述 |
| —- | ———————————– | ————————————————————————————————————————– | ————————————————————————————————————– |
| EAX | Extended Accumulator Reister | 累加器,用于算术运算(如 ADD、MUL)、函数返回值存储;高 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 | 源变址寄存器 | 源变址寄存器,用于字符串/数组操作的源地址指针(如 MOVS 指令自动递增 ESI);高 16 位 SI,无 8 位模式。 |
| EDI | Extended Distination Index Register | 目的变址寄存器 | 目的变址寄存器,用于字符串/数组操作的目标地址指针(如 MOVS 指令自动递增/递减 EDI);高 16 位 DI,无 8 位模式。 |
| EBP | Extended Base Pointer Register | 基指针寄存器,指向当前栈帧基地址([ebp+8]访问函数第一个参数);高 16 位 BP,无 8 位模式。 |
| ESP | Extended Stack Pointer Register | 栈指针寄存器,指向当前栈顶地址,随 PUSH/POP/CALL 自动调整;高 16 位 SP,无 8 位模式。 |
<原文出自: jiangxueqiao.com,请尊重原创>
64 位通用寄存器
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 位模式函数参数传递(如 Win64 位前 4 个整数/指针参数用 RCX、RDX、R8、R9 传递,后面的参数再从右向左压栈) |
段寄存器
(Segment Registers)
段寄存器存储内存段的基地址或选择子,在实模式和保护模式下作用不同:
实模式
通过“段地址 ×16 + 偏移地址”计算 20 位物理地址:
保护模式/长模式
存储段选择子(16 位),指向全局描述符表(GDT)/局部描述符表(LDT)中的段描述符:
| 缩写 | 英文全程 | 功能描述 |
|---|---|---|
| CS | Code Segment Register | 代码段寄存器 |
| DS | Data Segment Register | 数据段寄存器 |
| ES | Extra Segment Register | 附加段寄存器 |
| SS | Stack Segment Register | 栈段寄存器 |
| FS | 无严格全称 | 用户模式下,32 位进程可以通过 FS 获取 TEB 和 PEB 指针 32 位 Windows 内核模式下,通过 FS 获取 KPCR 指针 |
| GS | 无严格全称 | 用户模式下,64 位进程可以通过 GS 获取 TEB 和 PEB 指针 64 位 Windows 内核模式下,通过 GS 获取 KPCR 指针 |
标志寄存器
记录运算状态或控制 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) |
指令指针寄存器
| 缩写 | 英文全称 | 功能描述 |
|---|---|---|
| EIP | Extended Instruction Pointer | 32 位指令指针,存储下一条要执行的指令地址 |
| RIP | Instruction Pointer (64-bit) | 64 位指令指针,存储下一条要执行的指令地址 |
调试寄存器
(Debug Registers)
调试寄存器(Debug Registers)用于硬件级调试,支持设置硬件断点、监控内存访问和执行流程。这些寄存器包括DR0 ~ DR7,共 8 个,其中DR0 ~ DR3用于存储断点地址,DR4 ~ DR5保留,DR6 用于记录调试状态,DR7 用于控制调试行为。以下是详细介绍和表格列表。
在x64架构中,
DR0 ~ DR3扩展为64位,其他寄存器保持不变,仍为32位。

| 缩写 | 功能描述 |
|---|---|
| DR0 | 设置断点0的线性地址 |
| DR1 | 设置断点1的线性地址 |
| DR2 | 设置断点2的线性地址 |
| DR3 | 设置断点3的线性地址 |
| DR4 | 保留 |
| DR5 | 保留 |
| DR6 | 调试状态寄存器,记录调试异常触发条件 |
| DR7 | 调试控制寄存器,配置断点启用、类型和长度 |
DR7始终是32位寄存器,它的各位控制断点行为和启用状态,下表列出关键位(保留位通常置0,未列出)。
| 位范围 | 位名 | 作用描述 |
|---|---|---|
| 0 | L0 | 局部断点0启用(当前任务有效) |
| 1 | G0 | 全局断点0启用(所有任务有效) |
| 2 | L1 | 局部断点1启用 |
| 3 | G1 | 全局断点1启用 |
| 4 | L2 | 局部断点2启用 |
| 5 | G2 | 全局断点2启用 |
| 6 | L3 | 局部断点3启用 |
| 7 | G3 | 全局断点3启用 |
| 8 | LE | 局部精确断点启用(历史功能,现代x86中保留) |
| 9 | GE | 全局精确断点启用(历史功能,现代x86中保留) |
| 13 | GD | 调试寄存器访问检测启用:1=启用,访问调试寄存器触发异常 |
| 16-17 | RW0 | 断点0类型:00=指令执行,01=数据写入,11=数据读取/写入,10=未定义 |
| 18-19 | LEN0 | 断点0长度:00=1字节,01=2字节,10=8字节,11=4字节 |
| 20-21 | RW1 | 断点1类型(编码同RW0) |
| 22-23 | LEN1 | 断点1长度(编码同LEN0) |
| 24-25 | RW2 | 断点2类型(编码同RW0) |
| 26-27 | LEN2 | 断点2长度(编码同LEN0) |
| 28-29 | RW3 | 断点3类型(编码同RW0) |
| 30-31 | LEN3 | 断点3长度(编码同LEN0) |
注意:位10-12、14-15等为保留位。对于执行断点,其断点长度通常设为1字节。
DR6是32位调试状态寄存器,当调试异常发生时,硬件自动设置相应位。下表列出关键位(保留位通常为0,未列出)。
| 位 | 位名 | 作用描述 |
|---|---|---|
| 0 | B0 | 断点0触发:当DR0断点条件满足时置1 |
| 1 | B1 | 断点1触发:当DR1断点条件满足时置1 |
| 2 | B2 | 断点2触发:当DR2断点条件满足时置1 |
| 3 | B3 | 断点3触发:当DR3断点条件满足时置1 |
| 13 | BD | 调试寄存器访问检测触发:当DR7.GD=1且访问调试寄存器时置1 |
| 14 | BS | 单步异常触发:由EFLAGS.TF标志触发单步异常时置1 |
| 15 | BT | 任务切换触发:当任务切换且新任务TSS的T位为1时置1 |
注意:位4-12、16-31为保留位,通常为0。DR6位在调试异常处理程序中需软件清零(通常写1清零)。
x86 常用汇编指令
指令按功能分为数据传输、算术运算、逻辑操作、移位、比较与跳转等类别。多数指令会修改标志寄存器(如 CF、ZF),少数例外(如 PUSHF)。
数据传输指令
功能 :寄存器、内存或 I/O 端口间数据移动, 通常不影响标志寄存器。
| 指令缩写 | 英文全称 | 功能描述 | 影响标志 |
|---|---|---|---|
| MOV | Move | 寄存器/内存与寄存器/立即数传数据(如MOV EAX, 1)。 |
无 |
| XCHG | Exchange | 交换两个寄存器或寄存器与内存内容(如XCHG EAX, EBX)。 |
无 |
| PUSH | Push | 操作数压入栈(ESP/SP 递减,如PUSH EAX)。 |
无(除非操作数是标志寄存器) |
| POP | Pop | 从栈顶弹出数据到操作数(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)。 |
修改所有标志 |
算术运算指令
功能:加减乘除或带进位运算,显著修改状态标志(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 异常;标志无定义 |
逻辑操作指令
功能:按位与、或、异或等操作,影响 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 |
移位与循环移位指令
功能:左移、右移或循环移位,影响 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 无定义 |
比较与条件跳转指令
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/