在 Linux 下进行**反汇编(disassembly)**并“看寄存器”,通常分为两个层面:
下面按常见工具和场景给你讲清楚。
objdumpobjdump -d ./a.out
示例输出(x86-64):
mov %rsp,%rbp
sub $0x10,%rsp
mov %edi,-0x4(%rbp)
你能看到:
rsp:栈指针rbp:栈帧基址edi:第一个参数(System V ABI)常用寄存器速查(x86-64):
rdi, rsi, rdx, rcx, r8, r9:函数参数rax:返回值rsp:栈顶rbp:栈帧rip:当前指令地址gdb 反汇编gdb ./a.out
(gdb) disassemble main
或更好用的:
(gdb) layout asm
(gdb) layout regs
这会同时显示汇编 + 寄存器
gdb ./a.out
(gdb) break main
(gdb) run
(gdb) info registers
输出示例:
rax 0x0
rbx 0x0
rsp 0x7fffffffe1a0
rbp 0x7fffffffe1b0
rip 0x401126
看单个寄存器:
(gdb) p $rax
(gdb) info reg rax rsp rbp
(gdb) stepi
(gdb) info registers
或:
(gdb) ni # 汇编级单步
配合:
(gdb) x/10i $rip # 看接下来要执行的指令
mov r0, #1
bl func
r0-r3:参数r0:返回值pc:程序计数器(≈ rip)mov x0, #1
bl func
x0-x7:参数x0:返回值sp:栈指针pc:当前指令✅ 看寄存器变化:
gdb + info reglayout regs✅ 理解汇编含义:
rsp/rbp 判断栈结构✅ 实战流程:
gdb ./a.out
b main
r
layout asm
layout regs
ni
如果你愿意,可以:
我可以直接帮你“逐行解释寄存器在干嘛”。