汇编指令主要分为数据传输、算术运算、逻辑运算、控制转移、栈操作等几类。以下是常见的指令及示例。
📌 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
暂无评论内容