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

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


📌 1. 数据传输指令

指令作用
MOV dst, srcsrc 复制到 dst
XCHG dst, src交换 dstsrc 的值
PUSH srcsrc 压入栈
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, srcdst = dst + src(加法)
SUB dst, srcdst = dst - src(减法)
INC dstdst = dst + 1(自增)
DEC dstdst = dst - 1(自减)
MUL srcEAX = EAX * src(无符号乘法)
IMUL srcEAX = EAX * src(有符号乘法)
DIV srcEAX / 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, srcdst = dst & src(位与)
OR dst, srcdst = dst | src(位或)
XOR dst, srcdst = dst ^ src(位异或)
NOT dstdst = ~dst(取反)
SHL dst, ndst = dst << n(左移 n 位)
SHR dst, ndst = dst >> n(逻辑右移 n 位)
SAR dst, ndst = 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 srcsrc 压入栈
POP dst从栈顶弹出数据
CALL label调用函数(压入返回地址)
RET返回

示例

assembly复制编辑push eax      ; 把 eax 压入栈
pop ebx       ; 从栈弹出数据到 ebx
call my_func  ; 调用子程序
ret           ; 返回

📌 7. 循环指令

指令作用
LOOP labelECX--,如果 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
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容