汇编常见指令

发布于:2025-06-10 ⋅ 阅读:(24) ⋅ 点赞:(0)

汇编常见指令


一、数据传送指令

指令 功能 示例 说明
MOV 数据传送 MOV EAX, 10 将立即数 10 送入 EAX
MOV [EBX], EAX 将 EAX 值存入 EBX 指向的内存
LEA 加载有效地址 LEA EAX, [EBX+4] EBX+4 的地址存入 EAX(不访问内存)
XCHG 交换数据 XCHG EAX, EBX 交换 EAX 和 EBX 的值
PUSH/POP 栈操作 PUSH EAX 将 EAX 压入栈 POP EBX 弹出栈顶到 EBX

二、算术运算指令

指令 功能 示例
ADD 加法 ADD EAX, EBX ; EAX = EAX + EBX
SUB 减法 SUB AX, 5 ; AX = AX - 5
INC/DEC 自增/自减 INC ECX ; ECX++ DEC DL ; DL–
MUL 无符号乘法 MUL BL ; AX = AL * BL
IMUL 有符号乘法 IMUL CX ; DX:AX = AX * CX
DIV 无符号除法 DIV BX ; AX = (DX:AX) / BX
IDIV 有符号除法 IDIV CL ; AL = AX / CL

三、位操作指令

指令 功能 示例
AND 按位与 AND AL, 0xF0 ; 清零 AL 的低4位
OR 按位或 OR DX, 1 ; 设置 DX 的最低位为1
XOR 按位异或 XOR EAX, EAX ; 快速清零 EAX
NOT 按位取反 NOT BL ; BL = ~BL
SHL/SHR 逻辑左移/右移 SHL AX, 1 ; AX 左移1位(乘2)
SAL/SAR 算术左移/右移 SAR DX, 2 ; 有符号右移(除4)
ROL/ROR 循环左移/右移 ROL CL, 3 ; CL 循环左移3位

四、流程控制指令

1. 无条件跳转
指令 功能
JMP 跳转到指定地址 JMP label
2. 条件跳转(基于标志位)
指令 跳转条件 说明
JE/JZ ZF=1 相等/为零时跳转
JNE/JNZ ZF=0 不等/非零时跳转
JG/JNLE (ZF=0) & (SF=OF) 有符号大于时跳转
JL/JNGE SF ≠ OF 有符号小于时跳转
JA/JNBE (CF=0) & (ZF=0) 无符号大于时跳转
JB/JC CF=1 无符号小于/进位时跳转
3. 比较与测试
指令 功能 说明
CMP 比较操作数 CMP AX, BX ; 设置标志位(AX-BX)
TEST 位测试 TEST AL, 1 ; 检查 AL 最低位(AL & 1)
4. 循环控制
指令 功能 示例
LOOP ECX 减1,非零则跳转 LOOP label
LOOPE ECX≠0 且 ZF=1 时跳转 LOOPE label

五、函数调用指令

指令 功能 说明
CALL 调用函数 CALL func ; 压入返回地址后跳转
RET 从函数返回 RET ; 弹出返回地址并跳转

六、标志位操作

指令 功能
STC 设置进位标志 CF=1
CLC 清除进位标志 CF=0
STD 设置方向标志 DF=1(字符串操作从高地址向低地址)
CLD 清除方向标志 DF=0(默认低→高)

七、字符串操作指令

指令 功能 说明
MOVSB 移动字节串 [EDI] ← [ESI],按 DF 更新 ESI/EDI
CMPSB 比较字节串 比较 [ESI][EDI],更新标志位
SCASB 扫描字节串 比较 AL 和 [EDI],常用于搜索字符
LODSB 加载字节到 AL AL ← [ESI], ESI++
STOSB 存储 AL 到字节串 [EDI] ← AL, EDI++

🔥 提示:搭配前缀 REP(如 REP MOVSB)可重复执行至 ECX=0。


八、系统调用指令

架构 指令 功能
x86 (Linux) INT 0x80 触发系统调用(参数通过 EAX/EBX/ECX 传递)
x86-64 SYSCALL 64位系统调用(参数:RAX/RDI/RSI/RDX)
Windows INT 0x2E Windows NT 系统调用

关键注意点

  1. 操作数大小
    • MOV AL, BL(8位) vs MOV AX, BX(16位) vs MOV EAX, EBX(32位)
  2. 内存访问格式
    • 直接寻址:MOV EAX, [0x4000]
    • 寄存器间接:MOV CL, [ESI]
    • 带偏移:MOV DX, [EBX+8]
  3. AT&T vs Intel 语法
    • Intel:MOV EAX, DWORD PTR [EBX]
    • AT&T:movl (%ebx), %eax(目标在后)

经典代码片段

section .data
    msg db 'Hello World!', 0xA  ; 定义字符串

section .text
global _start
_start:
    MOV EAX, 4      ; sys_write 系统调用号
    MOV EBX, 1      ; 文件描述符 (stdout)
    MOV ECX, msg    ; 字符串地址
    MOV EDX, 13     ; 字符串长度
    INT 0x80        ; 调用内核

    MOV EAX, 1      ; sys_exit
    XOR EBX, EBX    ; 返回码 0
    INT 0x80