汇编常见指令
一、数据传送指令
指令 | 功能 | 示例 | 说明 |
---|---|---|---|
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 系统调用 |
关键注意点
- 操作数大小 :
MOV AL, BL
(8位) vsMOV AX, BX
(16位) vsMOV 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
(目标在后)
- Intel:
经典代码片段
c
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