温馨提示×

linux反汇编怎么看寄存器

小樊
40
2026-09-24 17:27:27
栏目: 智能运维

在 Linux 下进行**反汇编(disassembly)**并“看寄存器”,通常分为两个层面:

  1. 静态看:反汇编代码里看到的是“哪些寄存器被使用”
  2. 动态看:程序运行时,真正寄存器里的值是什么

下面按常见工具和场景给你讲清楚。


一、静态反汇编:看“用了哪些寄存器”

1. 使用 objdump

objdump -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:当前指令地址

2. 使用 gdb 反汇编

gdb ./a.out
(gdb) disassemble main

或更好用的:

(gdb) layout asm
(gdb) layout regs

这会同时显示汇编 + 寄存器


二、动态看寄存器(最常用)

1. 用 GDB 看寄存器

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

2. 单步执行看寄存器变化

(gdb) stepi
(gdb) info registers

或:

(gdb) ni        # 汇编级单步

配合:

(gdb) x/10i $rip   # 看接下来要执行的指令

三、ARM / ARM64 的区别(如果你看的是嵌入式)

ARM(32位)

mov r0, #1
bl  func
  • r0-r3:参数
  • r0:返回值
  • pc:程序计数器(≈ rip)

ARM64

mov x0, #1
bl  func
  • x0-x7:参数
  • x0:返回值
  • sp:栈指针
  • pc:当前指令

四、常见技巧总结

✅ 看寄存器变化:

  • gdb + info reg
  • layout regs

✅ 理解汇编含义:

  • 知道 ABI(参数/返回值约定)
  • 看 rsp/rbp 判断栈结构

✅ 实战流程:

gdb ./a.out
b main
r
layout asm
layout regs
ni

如果你愿意,可以:

  • 发一段反汇编代码
  • 或告诉我你是 x86 / x64 / ARM
  • 或你是看漏洞 / 逆向 / 调 bug

我可以直接帮你“逐行解释寄存器在干嘛”。

0 踩