汇编常见指令
一、数据传送指令
指令 | 功能 | 示例 | 说明 |
---|
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. 无条件跳转
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位) 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 .datamsg 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_exitXOR EBX, EBX ; 返回码 0INT 0x80