温馨提示×

linux反汇编怎样看参数

小樊
37
2026-09-03 09:14:55
栏目: 智能运维

在 Linux 下进行反汇编(比如用 objdumpgdbIDAradare2 等)时,“怎么看参数”取决于调用约定(calling convention)你是看函数调用处还是函数内部。下面以最常见的 x86-64 Linux(System V AMD64 ABI) 为例说明。


一、x86-64 Linux 参数传递规则(最重要)

1. 前 6 个整数/指针参数

按顺序放在寄存器:

参数序号 寄存器
第1个 rdi
第2个 rsi
第3个 rdx
第4个 rcx
第5个 r8
第6个 r9

2. 浮点参数

使用前 8 个 xmm0 ~ xmm7

3. 更多参数

超过 6 个的整数参数,会压栈(从右到左)

4. 返回值

  • 整数/指针:rax
  • 浮点:xmm0

二、在「调用处」看参数(caller)

示例汇编:

mov edi, 5
mov rsi, rax
call func

说明:

  • edi = 5 → 第1个参数
  • rsi = rax → 第2个参数

如果是栈上传参:

push 10
push 20
call func
  • 栈顶是最后一个参数(右到左)

三、在「函数内部」看参数(callee)

func:
    push rbp
    mov rbp, rsp
    ; rdi, rsi, rdx ... 仍然保存参数

此时:

  • rdi = 第1个参数
  • rsi = 第2个参数
  • 如果参数被保存到栈:
mov [rbp-8], rdi

说明第1个参数存在 [rbp-8]


四、栈帧与参数(x86-32 对比)

x86-32(cdecl)

push arg2
push arg1
call func

函数内:

mov eax, [ebp+8]   ; arg1
mov ebx, [ebp+12]  ; arg2

x86-64

一般不用栈看前6个参数


五、用 GDB 实际看参数(推荐)

gdb ./a.out
break func
run

查看参数:

info registers rdi rsi rdx

或:

print (int)$rdi

进入函数后:

bt
frame 0
info args

六、常见问题

Q1:参数被优化了怎么办?

  • -O0 编译
  • 或看调用处寄存器

Q2:变参函数(printf)怎么看?

  • 第一个参数 rdi 是格式串
  • 后续按类型从 rsi/rdx/... 或栈取

Q3:this 指针在哪?

  • C++ 中:rdithis

七、总结一句话

Linux x86-64:前6个参数看 rdi/rsi/rdx/rcx/r8/r9,超过的看栈;调用处和函数内都按这个规则。

如果你有具体反汇编代码或架构(ARM / x86-32 / RISC-V),我可以直接帮你逐行分析。

0