汇编常用的(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)实践。所有指令对标志位和段寄存器的影响需重点关注,以正确实现控制流和内存访问。

相关推荐
浩浩测试一下1 天前
汇编 标志位寄存器 (逆向分析 )
c语言·汇编·逆向·windows编程·标志寄存器
浩浩测试一下1 天前
汇编 数组与串指令(逆向分析)
汇编·逆向·二进制·免杀·串指令·汇编数组
浩浩测试一下1 天前
汇编 内联汇编与混合编程 (逆向分析)
汇编·混合编程·windows编程·内联汇编·二进制逆向·c语言混合汇编
浩浩测试一下1 天前
汇编 结构体与宏
汇编··免杀·结构体·windows编程·逆向二进制
浩浩测试一下2 天前
汇编中的JCC指令 (逆向分析)
汇编·逆向·标志位·jcc指令·跳转指令·标志位寄存器
浩浩测试一下2 天前
汇编中的段与段寄存器(大小)段序 (逆向分析)
汇编·逆向·二进制·字节序·windows编程·内存地址排序
浩浩测试一下3 天前
汇编 call与ret 函数与堆栈 (逆向分析)
汇编·push·函数·pop·call·ret·堆栈逆向
山屿落星辰3 天前
昇腾NPU算子开发:从“手写汇编“到“搭积木“
汇编
浩浩测试一下3 天前
汇编 汇编寻址 (逆向分析)
汇编·寻址·windows编程·二进制逆向·机器码