汇编常见指令
一、数据传送指令
指令 |
功能 |
示例 |
说明 |
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位) 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