汇编常见指令
一、数据传送指令
指令 功能 示例 说明 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 + EBXSUB
减法 SUB AX, 5
; AX = AX - 5INC
/DEC
自增/自减 INC ECX
; ECX++ DEC DL
; DL–MUL
无符号乘法 MUL BL
; AX = AL * BLIMUL
有符号乘法 IMUL CX
; DX:AX = AX * CXDIV
无符号除法 DIV BX
; AX = (DX:AX) / BXIDIV
有符号除法 IDIV CL
; AL = AX / CL
三、位操作指令
指令 功能 示例 AND
按位与 AND AL, 0xF0
; 清零 AL 的低4位OR
按位或 OR DX, 1
; 设置 DX 的最低位为1XOR
按位异或 XOR EAX, EAX
; 快速清零 EAXNOT
按位取反 NOT BL
; BL = ~BLSHL
/SHR
逻辑左移/右移 SHL AX, 1
; AX 左移1位(乘2)SAL
/SAR
算术左移/右移 SAR DX, 2
; 有符号右移(除4)ROL
/ROR
循环左移/右移 ROL CL, 3
; CL 循环左移3位
四、流程控制指令
1. 无条件跳转
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/EDICMPSB
比较字节串 比较 [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 系统调用
关键注意点
操作数大小 :
MOV AL, BL
(8位) vs MOV AX, BX
(16位) vs MOV EAX, EBX
(32位) 内存访问格式 :
直接寻址:MOV EAX, [0x4000]
寄存器间接:MOV CL, [ESI]
带偏移:MOV DX, [EBX+8]
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