温馨提示×

如何读懂linux反汇编码

小樊
34
2026-09-27 14:58:18
栏目: 智能运维

读懂 Linux 下的反汇编代码(尤其是 AT&T 语法或 Intel 语法)是理解程序底层执行、调试和性能优化的重要能力。下面我从工具 → 语法 → 常见结构 → 实战方法一步步讲。


一、先准备工具

常用反汇编/调试工具:

  • objdump:反汇编 ELF 文件
    objdump -d ./a.out
    
  • gdb:运行时反汇编
    disassemble main
    
  • objdump -S:源码 + 反汇编对照
    gcc -g -O0 test.c
    objdump -S ./a.out
    
  • readelf:查看段、符号
  • nm:查看符号表

二、认识两种汇编语法

Linux 默认常用 AT&T 语法(gcc/objdump):

AT&T 语法特点

movl %eax, %ebx
  • 源在前,目的在后
  • 寄存器加 %
  • 立即数加 $
  • 操作数大小后缀:b/w/l/q

Intel 语法(gdb 可切换)

mov ebx, eax
  • 目的在前,源在后
  • 无 %、$

切换:

set disassembly-flavor intel

三、反汇编代码的基本结构

以 objdump -d 为例:

0000000000401136 <main>:
  401136: 55              push   %rbp
  401137: 48 89 e5        mov    %rsp, %rbp
  40113a: c7 45 fc 0a 00  movl   $0xa, -0x4(%rbp)

各部分含义

地址      机器码        指令
401136:   55            push %rbp

四、函数开头(栈帧建立)

push %rbp
mov  %rsp, %rbp
sub  $0x10, %rsp

含义:

  • 保存调用者栈帧
  • 建立当前函数栈帧
  • 分配局部变量空间

五、常见指令速查

数据传送

mov dst, src
push / pop
lea(取地址)

算术运算

add / sub
imul
inc / dec

控制流

cmp a, b
je / jne / jg / jl
call / ret

系统调用(x86_64)

syscall

六、如何“读懂”一段反汇编

步骤 1:从函数入口看

  • main
  • 库函数:printf, malloc

步骤 2:看栈和变量

movl $0x1, -0x4(%rbp)

→ 局部变量(int x = 1)

步骤 3:对照源码(强烈推荐)

gcc -O0 -g test.c
objdump -S ./a.out

步骤 4:关注控制流

  • cmp + jmp → if / loop
  • call → 函数调用

七、实战小例子

C 代码:

int add(int a, int b) {
    return a + b;
}

反汇编(简化):

add:
  mov %edi, %eax
  add %esi, %eax
  ret

解读:

  • 参数在 %edi, %esi
  • 返回值在 %eax

八、学习建议

  1. 先学 C → 汇编对应关系
  2. 用 -O0 编译,避免优化干扰
  3. 多对比 objdump -S
  4. 熟悉 调用约定(System V AMD64)
  5. 从简单函数开始读

如果你愿意,可以:

  • 发一段具体反汇编代码
  • 或说明你是调试 / 逆向 / 学操作系统 / CTF

我可以直接帮你“逐行翻译”。

0 踩