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 无定义

比较与条件跳转指令

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/