x64汇编指令

基本指令格式

x64 汇编指令通常遵循以下格式:

1
[标签:] 操作码 [操作数1], [操作数2]

操作数可以是:

  • 立即数(常量)
  • 寄存器
  • 内存引用
  • 相对地址

数据传输指令

基本传输

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
; 寄存器到寄存器
MOV rax, rbx      ; 64位传输
MOV eax, ebx      ; 32位传输
MOV ax, bx        ; 16位传输
MOV al, bl        ; 8位传输

; 立即数到寄存器
MOV rax, 0x1234567890ABCDEF
MOV eax, 0x12345678

; 内存访问
MOV rax, [rbx]    ; 从内存读取
MOV [rbx], rax    ; 写入内存
MOV rax, [rbx+rsi*4+0x10]  ; 复杂寻址

特殊传输

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
; 零扩展
MOVZX rax, byte [rbx]   ; 8位到64位
MOVZX eax, word [rbx]   ; 16位到32位

; 符号扩展
MOVSX rax, byte [rbx]   ; 8位到64位
MOVSXD rax, dword [rbx] ; 32位到64位

; 条件传输
CMOVZ rax, rbx          ; ZF=1时传输
CMOVNZ rax, rbx         ; ZF=0时传输

算术运算指令

基本运算

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
; 加法
ADD rax, rbx      ; rax = rax + rbx
ADD rax, [rbx]    ; 从内存加载并相加
ADC rax, rbx      ; 带进位加法

; 减法
SUB rax, rbx      ; rax = rax - rbx
SBB rax, rbx      ; 带借位减法

; 乘法
MUL rbx           ; 无符号乘法,结果在 RDX:RAX
IMUL rbx          ; 有符号乘法
IMUL rax, rbx, 5  ; 三操作数乘法

; 除法
DIV rbx           ; 无符号除法
IDIV rbx          ; 有符号除法

位运算

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
; 逻辑运算
AND rax, rbx      ; 按位与
OR rax, rbx       ; 按位或
XOR rax, rbx      ; 按位异或
NOT rax           ; 按位取反

; 移位运算
SHL rax, 5        ; 逻辑左移
SHR rax, cl       ; 逻辑右移
SAR rax, 1        ; 算术右移
ROL rax, 8        ; 循环左移
ROR rax, 8        ; 循环右移

控制流指令

比较和跳转

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
; 比较指令
CMP rax, rbx      ; 比较两个操作数
TEST rax, rbx     ; 按位测试

; 无条件跳转
JMP label         ; 直接跳转
JMP [rax]         ; 间接跳转

; 条件跳转
JE/JZ label       ; 相等/零时跳转
JNE/JNZ label     ; 不相等/非零时跳转
JG/JNLE label     ; 大于时跳转
JGE/JNL label     ; 大于等于时跳转
JL/JNGE label     ; 小于时跳转
JLE/JNG label     ; 小于等于时跳转

函数调用

1
2
3
4
5
6
7
8
; 函数调用
CALL procedure    ; 调用过程
RET              ; 返回
LEAVE           ; 恢复栈帧

; 系统调用
SYSCALL         ; 系统调用
SYSENTER        ; 快速系统调用

栈操作指令

1
2
3
4
5
6
7
8
9
; 基本栈操作
PUSH rax         ; 压栈
POP rax          ; 出栈
PUSHFQ          ; 压入标志寄存器
POPFQ           ; 弹出标志寄存器

; 多寄存器操作
PUSHA           ; 压入所有通用寄存器
POPA            ; 弹出所有通用寄存器

SIMD 指令

SSE 指令

1
2
3
4
5
6
7
8
; 数据传输
MOVUPS xmm0, [rax]     ; 未对齐传输
MOVAPS xmm0, [rax]     ; 对齐传输

; 算术运算
ADDPS xmm0, xmm1      ; 并行单精度加法
MULPS xmm0, xmm1      ; 并行单精度乘法
DIVPS xmm0, xmm1      ; 并行单精度除法

AVX 指令

1
2
3
; 256位操作
VMOVUPS ymm0, [rax]   ; 未对齐传输
VADDPS ymm0, ymm1, ymm2  ; 三操作数加法

系统指令

1
2
3
4
5
6
7
8
; 中断和异常
INT 3           ; 调试断点
INT 0x80        ; 系统调用(传统方式)

; 特权级指令
CLI             ; 清中断标志
STI             ; 设置中断标志
HLT             ; 处理器暂停

优化技巧

1. 性能优化

1
2
3
4
5
6
7
8
9
; 使用 LEA 进行快速计算
LEA rax, [rbx+rbx*2]   ; rax = rbx * 3

; 使用 XOR 清零
XOR eax, eax           ; 比 MOV eax, 0 更快

; 使用条件传送替代跳转
CMP rax, rbx
CMOVG rax, rbx         ; 比使用 JG 更高效

2. 代码对齐

1
2
3
4
; 16字节对齐
ALIGN 16
function_start:
    ; 函数代码

调试相关

1. 断点指令

1
2
3
4
5
6
7
; 软件断点
INT 3               ; CC 断点
UD2                ; 未定义指令断点

; 条件断点
CMP rax, 1
JE debug_point     ; 条件成立时中断

2. 追踪指令

1
2
3
4
; 单步执行
PUSHF
OR word [rsp], 0x100  ; 设置 TF
POPF

安全编程

1. 栈保护

1
2
3
4
5
6
7
8
9
; 函数序言
PUSH rbp
MOV rbp, rsp
SUB rsp, 32      ; 分配栈空间

; 函数尾声
MOV rsp, rbp
POP rbp
RET

2. 数据清理

1
2
3
; 安全清零
XOR rax, rax
MOV [rbx], rax   ; 清零内存

57.12k 字
43篇文章