汇编常用的(JCC 串 判断)指令 通用寄存器 标志寄存器 段寄存器(逆向分析)

目录

通用寄存器

32位通用寄存器(x86)

64位通用寄存器(x86-64)

子寄存器

段寄存器

主要段寄存器

[标志寄存器(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. 标志操作指令)

汇编寻址方式

JCC指令(条件跳转)

无符号跳转

有符号跳转

通用

特殊标志

[串指令(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:标志压/出栈。


汇编寻址方式

  1. 立即数寻址 :操作数直接在指令中(如MOV EAX, 5)。

  2. 寄存器寻址:操作数在寄存器中。

  3. 直接寻址:地址直接给出。

  4. 寄存器间接寻址[EBX]

  5. 基址寻址[EBX + disp]

  6. 变址寻址[ESI + disp]

  7. 基址变址寻址[EBX + ESI]

  8. 基址变址比例寻址 (SIB):[EBX + ESI*4 + disp](比例1/2/4/8)。

  9. 相对寻址:相对于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)实践。所有指令对标志位和段寄存器的影响需重点关注,以正确实现控制流和内存访问。

相关推荐
AI科技星1 天前
《全域数学/数术工坊》体系总览
c语言·开发语言·汇编·electron·概率论
H Journey1 天前
用汇编语言写一个hello world,并进行汇编和编译
汇编·assembly·寄存器
逆境不可逃1 天前
一篇速成 汇编程序语言设计之 8086 汇编核心指令
汇编
疯狂打码的少年2 天前
【程序语言与编译】程序设计语言分类(机器/汇编/高级)
汇编·笔记
JAMSAN09302 天前
16.0% 高增长!全球异构计算架构服务市场扩容态势
汇编·人工智能·架构
iCxhust4 天前
8086汇编 word ptr
汇编·单片机·嵌入式硬件·微机原理·8088单板机
大阳1234 天前
ARM.9(RGBLCD,PWM)
c语言·开发语言·汇编·单片机·嵌入式硬件·pwm·rgblcd
2301_789015625 天前
Linux基础开发工具一:软件包管理器、vim编辑器
linux·服务器·c语言·汇编·c++·编辑器·vim
是星辰吖~6 天前
X86反汇编_深度学习_基础二叉树
汇编
iCxhust6 天前
汇编返回指令ret iret retf区别
汇编·微机原理·8088单板机