- 数据传送指令
- MOV - 数据传送
- LEA - 加载有效地址
- 算术运算指令
- ADD/SUB - 加减法
- IMUL - 有符号乘法
- SAR - 算术右移
- 逻辑运算指令
- OR - 按位或
- XOR - 按位异或
- TEST - 逻辑测试
- 控制转移指令
- CALL - 调用子程序
- Jcc - 条件跳转
- 栈操作指令
- PUSH/POP
- 系统调用指令
- SYSCALL
- REP STOSQ - 块存储
- 内存操作数寻址模式
- 指令集特点总结
数据传送指令
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 ; 栈指针调整
sub eax, ebx ; 32位减法
标志位影响: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(对应字节、字、双字、四字)
指令集特点总结
-
寄存器使用:
- 16个通用寄存器(RAX-R15)
- 专用寄存器:RSP(栈指针)、RBP(帧指针)、RIP(指令指针)
-
操作数顺序:
- Intel语法:目标在前,源在后
- 与AT&T语法相反
-
内存引用:
- 必须用
[]明确表示 - 支持复杂寻址模式
- 必须用
-
数据类型:
- 支持1(byte)、2(word)、4(dword)、8(qword)字节操作
- 通过指令后缀或寄存器名称隐含
-
调用约定:
- System V AMD64 ABI:
- 整数参数:RDI, RSI, RDX, RCX, R8, R9
- 浮点参数:XMM0-XMM7
- 返回值:RAX/RDX
- System V AMD64 ABI:
这套指令集组合实现了从基本的算术运算到复杂的内存操作,能够高效地实现高级语言的各种功能。在您分析的代码中,这些指令被巧妙地组合使用来实现Reactor模式的核心功能。
