在 Linux 下进行反汇编(比如用 objdump、gdb、IDA、radare2 等)时,“怎么看参数”取决于调用约定(calling convention)和你是看函数调用处还是函数内部。下面以最常见的 x86-64 Linux(System V AMD64 ABI) 为例说明。
按顺序放在寄存器:
| 参数序号 | 寄存器 |
|---|---|
| 第1个 | rdi |
| 第2个 | rsi |
| 第3个 | rdx |
| 第4个 | rcx |
| 第5个 | r8 |
| 第6个 | r9 |
使用前 8 个 xmm0 ~ xmm7
超过 6 个的整数参数,会压栈(从右到左)
raxxmm0示例汇编:
mov edi, 5
mov rsi, rax
call func
说明:
edi = 5 → 第1个参数rsi = rax → 第2个参数如果是栈上传参:
push 10
push 20
call func
func:
push rbp
mov rbp, rsp
; rdi, rsi, rdx ... 仍然保存参数
此时:
rdi = 第1个参数rsi = 第2个参数mov [rbp-8], rdi
说明第1个参数存在 [rbp-8]
push arg2
push arg1
call func
函数内:
mov eax, [ebp+8] ; arg1
mov ebx, [ebp+12] ; arg2
一般不用栈看前6个参数
gdb ./a.out
break func
run
查看参数:
info registers rdi rsi rdx
或:
print (int)$rdi
进入函数后:
bt
frame 0
info args
-O0 编译rdi 是格式串rsi/rdx/... 或栈取rdi 是 thisLinux x86-64:前6个参数看 rdi/rsi/rdx/rcx/r8/r9,超过的看栈;调用处和函数内都按这个规则。
如果你有具体反汇编代码或架构(ARM / x86-32 / RISC-V),我可以直接帮你逐行分析。