5 4 月 2026, 周日

常见的汇编指令(x86/x86-64)

汇编指令主要分为数据传输、算术运算、逻辑运算、控制转移、栈操作等几类。以下是常见的指令及示例。

1. 数据传输指令

指令 作用
MOV dst, src src 复制到 dst
XCHG dst, src 交换 dstsrc 的值
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 比较 op1op2
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 汇编指令

  • 数据传输MOVPUSHPOPLEA
  • 算术运算ADDSUBMULDIV
  • 逻辑运算ANDORXORNOT
  • 跳转JMPJEJNEJG
  • PUSHPOPCALLRET
  • 循环LOOPREP
Avatar photo

sion932