技术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 ; 清零内存