目录
[标志寄存器(EFLAGS / RFLAGS)](#标志寄存器(EFLAGS / RFLAGS))
[1. 数据传送指令](#1. 数据传送指令)
[2. 算术运算指令(影响CF/ZF/SF/OF等)](#2. 算术运算指令(影响CF/ZF/SF/OF等))
[3. 逻辑运算指令(影响ZF/SF/PF)](#3. 逻辑运算指令(影响ZF/SF/PF))
[4. 位操作指令(影响CF/OF)](#4. 位操作指令(影响CF/OF))
[5. 控制转移指令](#5. 控制转移指令)
[6. 标志操作指令](#6. 标志操作指令)
[串指令(String Instructions)](#串指令(String Instructions))

通用寄存器
x86 架构的通用寄存器用于存储临时数据、执行算术/逻辑运算、地址计算等,是处理器核心组件。
32位通用寄存器(x86)
-
EAX:累加器(Accumulator)。主要用于算术运算、逻辑运算和函数返回值。低16位为AX(AH+AL)。
-
EBX:基址寄存器(Base Register)。用于数据指针或基址索引。低16位为BX(BH+BL)。
-
ECX:计数器(Counter Register)。用于循环计数(如REP指令)和字符串操作。低16位为CX(CH+CL)。
-
EDX:数据寄存器(Data Register)。用于I/O操作和乘除法辅助(与EAX配合存储高位结果)。低16位为DX(DH+DL)。
-
ESI:源索引寄存器(Source Index)。字符串操作源地址指针。低16位为SI。
-
EDI:目标索引寄存器(Destination Index)。字符串操作目标地址指针。低16位为DI。
-
EBP:基址指针寄存器(Base Pointer)。栈帧管理,访问局部变量和参数。低16位为BP。
-
ESP:栈指针寄存器(Stack Pointer)。指向栈顶,管理PUSH/POP。低16位为SP。
64位通用寄存器(x86-64)
寄存器扩展为64位(前缀R),新增R8~R15。仍兼容低32/16/8位子寄存器。
-
RAX:64位累加器(低32位EAX)。
-
RBX:64位基址寄存器(低32位EBX)。
-
RCX:64位计数器(低32位ECX)。
-
RDX:64位数据寄存器(低32位EDX)。
-
RSI:64位源索引(低32位ESI)。
-
RDI:64位目标索引(低32位EDI)。
-
RBP:64位基址指针(低32位EBP)。
-
RSP:64位栈指针(低32位ESP)。
-
R8~R15:新增通用寄存器,常用于函数参数传递(System V ABI中RDI, RSI, RDX, RCX, R8, R9传参,RAX存返回值)。各有低32位(R8D等)、低16位(R8W)、低8位(R8B)。
底层原理:寄存器是CPU内部高速存储单元,直接参与指令执行。x86采用CISC架构,允许灵活使用。64位扩展增加寄存器数量,减少内存访问,提高性能,并保持向后兼容。
子寄存器
x86寄存器支持部分访问(向后兼容):
-
64位寄存器 → 可访问低32位(EAX等)、低16位(AX等)、低8位(AL/AH等)。
-
示例:
-
RAX:全64位;EAX(低32位);AX(低16位);AH(高8位)、AL(低8位)。
-
RBX → EBX → BX → BH/BL。
-
R8 → R8D(32位)→ R8W(16位)→ R8B(8位)。
-
这些子寄存器在32位模式下直接对应,在64位模式下保持兼容。
段寄存器
x86使用分段内存管理机制,段寄存器存储段选择子或基址。
主要段寄存器
-
CS:代码段(Code Segment)。存储当前执行代码段,结合IP/EIP/RIP。
-
DS:数据段(Data Segment)。默认数据访问段。
-
SS:栈段(Stack Segment)。栈操作(PUSH/POP),结合SP/ESP/RSP。
-
ES:附加段(Extra Segment)。字符串操作目标等。
-
FS:附加段,常用于线程局部存储(TLS)。Windows指向TEB。
-
GS:附加段,Linux常用于TLS或内核数据。
实模式 :段寄存器存基址(左移4位)+偏移 = 物理地址(最大1MB)。 保护模式 :段寄存器存段选择子 (16位),指向GDT/LDT中的段描述符 (含基址、限长、权限)。 64位长模式:CS/DS/ES/SS基址固定为0(平坦模型),FS/GS通过MSR设置基址用于TLS。
段选择子结构:
-
位0-1:RPL(请求特权级)
-
位2:TI(0=GDT,1=LDT)
-
位3-15:索引(描述符编号)
地址计算(保护模式):线性地址 = 段描述符基址 + 偏移。
使用示例(实模式):
MOV AX, 0x1000
MOV DS, AX
MOV EAX, [DS:0x0100] ; 从DS:0100读取
标志寄存器(EFLAGS / RFLAGS)
EFLAGS (32位模式) / RFLAGS(64位模式)存储指令执行状态,用于条件跳转和控制。
主要标志位(按位号)
-
位0 CF:进位标志(无符号溢出/借位)。JC/JNC使用。
-
位2 PF:奇偶标志(最低字节1的个数为偶)。
-
位4 AF:辅助进位(BCD运算)。
-
位6 ZF:零标志(结果为0)。JZ/JNZ、JE/JNE使用。
-
位7 SF:符号标志(结果最高位)。
-
位8 TF:陷阱标志(单步调试)。
-
位9 IF:中断标志(CLI/STI控制外部中断)。
-
位10 DF:方向标志(字符串操作方向,CLD/STD)。
-
位11 OF:溢出标志(有符号溢出)。JO/JNO使用。
-
其他:IOPL(I/O特权级)、NT(嵌套任务)、RF、VM、AC、VIF、VIP、ID等。
操作系统差异:
-
Windows/Linux 在用户模式下主要使用CF、ZF、SF、OF、PF、DF、IF。
-
内核模式 可访问更多(如IOPL、VM)。
-
64位模式下RFLAGS扩展,但低32位与EFLAGS相同。
标志更新:算术/逻辑/比较指令(如ADD、CMP、SUB)自动更新相关标志。
常用指令
1. 数据传送指令
-
MOV:数据复制(不影响标志)。
-
XCHG:交换值(支持LOCK原子)。
-
LEA:加载有效地址(AGU计算,不访问内存)。
-
PUSH/POP:栈操作(影响ESP/RSP)。
2. 算术运算指令(影响CF/ZF/SF/OF等)
-
ADD/SUB:加/减。
-
ADC/SBB:带进位加/减。
-
INC/DEC:自增/自减(不影响CF)。
-
MUL/IMUL:乘法(结果EDX:EAX)。
-
DIV/IDIV:除法(商EAX,余EDX)。
-
NEG:取负。
3. 逻辑运算指令(影响ZF/SF/PF)
-
AND/OR/XOR:位逻辑。
-
NOT:取反。
-
TEST:与运算但不写回结果(用于条件测试)。
4. 位操作指令(影响CF/OF)
-
SHL/SHR:逻辑移位。
-
SAL/SAR:算术移位(SAR保持符号)。
-
ROL/ROR/RCL/RCR:循环移位。
5. 控制转移指令
-
JMP:无条件跳转。
-
CALL/RET:子程序调用/返回(PUSH/POP EIP/RIP)。
-
LOOP:ECX计数循环。
6. 标志操作指令
-
CLC/STC:清/设CF。
-
CLI/STI:禁/启中断(修改IF)。
-
LAHF/SAHF:标志与AH交换。
-
PUSHF/POPF:标志压/出栈。
汇编寻址方式
-
立即数寻址 :操作数直接在指令中(如
MOV EAX, 5)。 -
寄存器寻址:操作数在寄存器中。
-
直接寻址:地址直接给出。
-
寄存器间接寻址 :
[EBX]。 -
基址寻址 :
[EBX + disp]。 -
变址寻址 :
[ESI + disp]。 -
基址变址寻址 :
[EBX + ESI]。 -
基址变址比例寻址 (SIB):
[EBX + ESI*4 + disp](比例1/2/4/8)。 -
相对寻址:相对于IP/EIP/RIP(常用于JMP/JCC)。
基址寄存器 :BX/EBX/RBX、BP/EBP/RBP(常用于栈帧)。 变址寄存器:SI/ESI/RSI、DI/EDI/RDI(常用于字符串/数组)。
JCC指令(条件跳转)
根据EFLAGS标志位决定是否跳转(相对偏移)。
无符号跳转
-
JA / JNBE:高于(CF=0且ZF=0)
-
JAE / JNB:高于等于(CF=0)
-
JB / JNAE:低于(CF=1)
-
JBE / JNA:低于等于(CF=1或ZF=1)
有符号跳转
-
JG / JNLE:大于(ZF=0且SF=OF)
-
JGE / JNL:大于等于(SF=OF)
-
JL / JNGE:小于(SF≠OF)
-
JLE / JNG:小于等于(ZF=1或SF≠OF)
通用
-
JE / JZ:相等/零(ZF=1)
-
JNE / JNZ:不等/非零(ZF=0)
特殊标志
-
JC / JNC:进位/无进位
-
JO / JNO:溢出/无溢出
-
JS / JNS:符号/无符号
-
JP / JPE:偶校验
-
JNP / JPO:奇校验
原理:CPU读取EFLAGS对应位,进行逻辑判断,结合分支预测更新RIP。
串指令(String Instructions)
与REP前缀配合实现高效内存块操作。
主要指令
-
MOVS(MOVSB/W/D/Q):移动字符串(DS:SI/RSI → ES:DI/RDI)。
-
CMPS(CMPSB/W/D/Q):比较字符串。
-
SCAS(SCASB/W/D/Q):扫描(与AL/AX/EAX/RAX比较)。
-
LODS(LODSB/W/D/Q):加载到累加器。
-
STOS(STOSB/W/D/Q):存储累加器到目标。
-
INS/OUTS:I/O端口串操作。
重复前缀
-
REP:重复ECX/RCX次。
-
REPE/REPZ:重复至ECX=0或ZF=0。
-
REPNE/REPNZ:重复至ECX=0或ZF=1。
方向控制:CLD(DF=0,递增)、STD(DF=1,递减)。
示例(字符串复制):
CLD
MOV ESI, src
MOV EDI, dst
MOV ECX, len
REP MOVSB
总结:
x86汇编是理解计算机底层运行机制的关键。掌握寄存器、标志、指令和寻址方式后,可深入操作系统开发、逆向工程和性能优化。
实际编程建议结合NASM/GAS和调试器(如GDB/WinDbg)实践。所有指令对标志位和段寄存器的影响需重点关注,以正确实现控制流和内存访问。