汇编指令主要分为数据传输、算术运算、逻辑运算、控制转移、栈操作等几类。以下是常见的指令及示例。
📌 1. 数据传输指令
| 指令 | 作用 |
|---|---|
MOV dst, src | 把 src 复制到 dst |
XCHG dst, src | 交换 dst 和 src 的值 |
PUSH src | 将 src 压入栈 |
POP dst | 从栈顶弹出数据到 dst |
LEA dst, [addr] | 计算内存地址并存入 dst |
LAHF / SAHF | 读取 / 存储标志寄存器 |
示例:
assembly复制编辑mov eax, 10 ; eax = 10
mov ebx, eax ; ebx = eax
lea eax, [ebx+4] ; eax = ebx + 4(地址计算)
push eax ; 把 eax 压入栈
pop ecx ; 弹出栈顶数据到 ecx
📌 2. 算术运算指令
| 指令 | 作用 |
|---|---|
ADD dst, src | dst = dst + src(加法) |
SUB dst, src | dst = dst - src(减法) |
INC dst | dst = dst + 1(自增) |
DEC dst | dst = dst - 1(自减) |
MUL src | EAX = EAX * src(无符号乘法) |
IMUL src | EAX = EAX * src(有符号乘法) |
DIV src | EAX / src,结果在 EAX,余数在 EDX |
IDIV src | 有符号除法 |
示例:
assembly复制编辑mov eax, 5 ; eax = 5
add eax, 3 ; eax = eax + 3
sub eax, 2 ; eax = eax - 2
inc eax ; eax + 1
dec eax ; eax - 1
mov eax, 6
mov ebx, 2
mul ebx ; eax = eax * ebx
div ebx ; eax = eax / ebx(商),edx = 余数
📌 3. 逻辑运算指令
| 指令 | 作用 |
|---|---|
AND dst, src | dst = dst & src(位与) |
OR dst, src | dst = dst | src(位或) |
XOR dst, src | dst = dst ^ src(位异或) |
NOT dst | dst = ~dst(取反) |
SHL dst, n | dst = dst << n(左移 n 位) |
SHR dst, n | dst = dst >> n(逻辑右移 n 位) |
SAR dst, n | dst = dst >> n(算术右移 n 位) |
示例:
assembly复制编辑mov eax, 0b1100 ; eax = 1100
and eax, 0b1010 ; eax = 1000(位与)
or eax, 0b0011 ; eax = 1011(位或)
xor eax, 0b1111 ; eax = 0100(位异或)
not eax ; eax = 1011(取反)
shl eax, 2 ; eax = 101100(左移 2 位)
shr eax, 1 ; eax = 010110(逻辑右移 1 位)
📌 4. 比较和条件跳转
| 指令 | 作用 |
|---|---|
CMP op1, op2 | 比较 op1 和 op2 |
TEST op1, op2 | 按位与后设置标志位 |
JE/JZ label | 相等时跳转(Zero flag = 1) |
JNE/JNZ label | 不相等时跳转 |
JG/JNLE label | > 时跳转 |
JGE/JNL label | >= 时跳转 |
JL/JNGE label | < 时跳转 |
JLE/JNG label | <= 时跳转 |
示例:
assembly复制编辑mov eax, 10
cmp eax, 5
je equal_label ; 如果 eax == 5,跳转
jg greater_label ; 如果 eax > 5,跳转
jl less_label ; 如果 eax < 5,跳转
📌 5. 无条件跳转
| 指令 | 作用 |
|---|---|
JMP label | 无条件跳转 |
CALL func | 调用子程序 |
RET | 返回 |
示例:
assembly复制编辑jmp start
start:
mov eax, 10
call print_num
ret
📌 6. 栈操作
| 指令 | 作用 |
|---|---|
PUSH src | 将 src 压入栈 |
POP dst | 从栈顶弹出数据 |
CALL label | 调用函数(压入返回地址) |
RET | 返回 |
示例:
assembly复制编辑push eax ; 把 eax 压入栈
pop ebx ; 从栈弹出数据到 ebx
call my_func ; 调用子程序
ret ; 返回
📌 7. 循环指令
| 指令 | 作用 |
|---|---|
LOOP label | ECX--,如果 ECX != 0,跳转到 label |
REP | 重复执行字符串操作指令 |
示例:
assembly复制编辑mov ecx, 5
loop_start:
dec ecx
cmp ecx, 0
jne loop_start ; 如果 ecx 不是 0,就继续循环
🔥 总结
📌 常用的 x86 汇编指令
- 数据传输:
MOV、PUSH、POP、LEA - 算术运算:
ADD、SUB、MUL、DIV - 逻辑运算:
AND、OR、XOR、NOT - 跳转:
JMP、JE、JNE、JG - 栈:
PUSH、POP、CALL、RET - 循环:
LOOP、REP
THE END






暂无评论内容