x86-64 汇编指令详细参考手册


数据传送指令


MOV - 数据传送

格式MOV 目标, 源
功能:将源操作数复制到目标操作数
操作数类型

  • 寄存器到寄存器
  • 立即数到寄存器
  • 内存到寄存器(加载)
  • 寄存器到内存(存储)

示例

mov rax, rbx        ; 寄存器到寄存器
mov [rsp], rdx      ; 寄存器到内存
mov ecx, 42         ; 立即数到寄存器
mov rdx, [rsi+8]    ; 内存到寄存器

标志位影响:不影响任何标志位


LEA - 加载有效地址

格式LEA 目标, 源
功能:计算源操作数的有效地址(不访问内存),结果存入目标
特点:常用于地址计算和算术运算优化

示例

lea rax, [rbx+rcx*8+20h]  ; 计算复杂地址
lea rsi, [rel data_area]  ; 获取相对地址

标志位影响:不影响任何标志位


算术运算指令


ADD/SUB - 加减法

格式ADD/SUB 目标, 源
功能:执行加法/减法运算,结果存入目标

示例

add rsp, 40h        ; 栈指针调整 

功能: 将源操作数的值加到目标操作数上,结果存储在目标操作数中
具体操作:

  • 将栈指针RSP的值增加40h(十六进制的40,即十进制的64)
  • 不修改标志寄存器(除非使用带sub rsp, 40h形式的指令)
  • 二进制编码: 通常编码为 48 83 C4 40(REX.W前缀 + ADD指令)
sub eax, ebx        ; 32位减法

功能: 从目标操作数中减去源操作数,结果存储在目标操作数中
具体操作:

  • 执行EAX = EAX - EBX
  • 结果影响标志寄存器(OF, SF, ZF, AF, PF, CF)
  • 只操作32位寄存器,不影响高32位(RAX的高32位保持不变)
  • 二进制编码: 通常编码为 29 D8(SUB指令)

标志位影响:OF, SF, ZF, AF, CF, PF


IMUL - 有符号乘法

格式

  • IMUL 目标(单操作数,隐含使用RAX)
  • IMUL 目标, 源(双操作数)
  • IMUL 目标, 源, 立即数(三操作数)

示例

imul rdx        ; RDX:RAX = RAX * RDX
imul rbx, rcx   ; RBX = RBX * RCX
imul rsi, rdi, 5 ; RSI = RDI * 5

标志位影响:OF, CF(其他未定义)


SAR - 算术右移

格式SAR 目标, 计数
功能:带符号扩展的右移(最高位补符号位)

示例

sar rax, 3      ; RAX算术右移3位
sar byte [rdi], 1 ; 内存操作数右移

标志位影响:OF, SF, ZF, AF, CF, PF


逻辑运算指令


OR - 按位或

格式OR 目标, 源
功能:按位或运算,结果存入目标

示例

or rax, rbx     ; 寄存器或运算
or [rsp], rdx   ; 内存或运算

标志位影响:OF=0, SF, ZF, AF=未定义, CF=0, PF


XOR - 按位异或

格式XOR 目标, 源
功能:按位异或运算,常用于清零寄存器

示例

xor eax, eax    ; 快速清零EAX
xor [rdi], rsi  ; 内存异或运算

标志位影响:OF=0, SF=0, ZF, AF=未定义, CF=0, PF


TEST - 逻辑测试

格式TEST 操作数1, 操作数2
功能:执行按位与运算并设置标志位,不保存结果

示例

test rax, rax   ; 检查RAX是否为0
test [rbx], 1   ; 测试最低位

标志位影响:OF=0, SF, ZF, AF=未定义, CF=0, PF


控制转移指令


CALL - 调用子程序

格式CALL 目标
功能:将返回地址压栈并跳转到目标地址

示例

call _printf    ; 调用外部函数
call [rax+8]    ; 通过指针调用

栈操作PUSH RIP(64位返回地址)


Jcc - 条件跳转

格式Jcc 目标
常见条件

  • JLE:小于等于跳转(SF≠OF或ZF=1)
  • JE/JZ:等于/为零跳转
  • JNE/JNZ:不等于/非零跳转
  • JG/JNLE:大于跳转

示例

jle short loc_1234  ; 条件跳转

栈操作指令


PUSH/POP

格式PUSH 源 / POP 目标
功能:压栈/出栈操作(64位模式下操作8字节)

示例

push rbp        ; 保存帧指针
pop rax         ; 恢复寄存器

栈指针变化:每次操作RSP±8


系统调用指令


SYSCALL

格式SYSCALL
功能:快速系统调用(替代传统的INT 80h)

寄存器使用

  • RAX:系统调用号
  • RDI, RSI, RDX, R10, R8, R9:参数
  • RCX和R11被破坏

REP STOSQ - 块存储

格式REP STOSQ
功能:重复将RAX的值存储到RDI指向的内存

寄存器使用

  • RDI:目标地址
  • RCX:计数
  • RAX:存储的值

示例

xor eax, eax
mov rdi, rsp
mov rcx, 16
rep stosq       ; 清零128字节栈空间

内存操作数寻址模式

通用格式
[基址 + 索引*比例因子 + 位移]

示例

mov rax, [rsp+rbx*8+1c8h]  ; 复杂寻址
lea rdx, [rsi+rdi*4]       ; 地址计算

比例因子:1, 2, 4, 8(对应字节、字、双字、四字)


指令集特点总结

  1. 寄存器使用

    • 16个通用寄存器(RAX-R15)
    • 专用寄存器:RSP(栈指针)、RBP(帧指针)、RIP(指令指针)
  2. 操作数顺序

    • Intel语法:目标在前,源在后
    • 与AT&T语法相反
  3. 内存引用

    • 必须用[]明确表示
    • 支持复杂寻址模式
  4. 数据类型

    • 支持1(byte)、2(word)、4(dword)、8(qword)字节操作
    • 通过指令后缀或寄存器名称隐含
  5. 调用约定

    • System V AMD64 ABI:
      • 整数参数:RDI, RSI, RDX, RCX, R8, R9
      • 浮点参数:XMM0-XMM7
      • 返回值:RAX/RDX

这套指令集组合实现了从基本的算术运算到复杂的内存操作,能够高效地实现高级语言的各种功能。在您分析的代码中,这些指令被巧妙地组合使用来实现Reactor模式的核心功能。

posted @ 2025-08-08 16:27  guanyubo  阅读(772)  评论(0)    收藏  举报