【问题标题】:meaning of objdump -d output assemblyobjdump -d 输出程序集的含义
【发布时间】:2014-03-11 15:47:06
【问题描述】:

我试图弄清楚这个 objdump -d 的所有元素的含义。

例如我有:

08048b50 <phase_1>:
8048b50:    83 ec 1c                sub    $0x1c,%esp
 8048b53:   c7 44 24 04 68 a2 04    movl   $0x804a268,0x4(%esp)
 8048b5a:   08 
 8048b5b:   8b 44 24 20             mov    0x20(%esp),%eax
 8048b5f:   89 04 24                mov    %eax,(%esp)
 8048b62:   e8 63 04 00 00          call   8048fca <strings_not_equal>
 8048b67:   85 c0                   test   %eax,%eax
 8048b69:   74 05                   je     8048b70 <phase_1+0x20>
 8048b6b:   e8 f5 06 00 00          call   8049265 <explode_bomb>
 8048b70:   83 c4 1c                add    $0x1c,%esp
 8048b73:   c3                      ret    

特别是我不确定第一列和中间列在告诉我什么

【问题讨论】:

    标签: c assembly disassembly objdump


    【解决方案1】:

    第一列告诉你代码在运行时所在的内存地址。

    第二列是可执行指令的十六进制版本。

    第三(和第四)列具有第二列的反汇编版本。即操作码和操作数。

    【讨论】:

    • 好的,谢谢——是否可以获得寄存器中值的字符串表示形式?例如,我将程序单步执行到第 8048b67 行:85 c0 test %eax,%eax 我想知道 %eax 正在测试的字符串
    • 如果您使用 gdb:info registers 可以查看所有这些,或者info registers [register name] 可以查看特定的一个。您使用的是哪个调试器?
    • 好的,再次感谢——还有一个问题——当我进行信息寄存器时,最后两列是什么意思?例如:eax 0x804c800 134531072
    • 第二列是存储值的十六进制表示,第三列是相同数字的十进制。
    • 有没有办法获得字符串表示? (是的,我正在使用 gdb)
    【解决方案2】:

    first :地址,十六进制。 两个相邻地址的差就是机器码的个数。

    秒:机器码,十六进制。

    第三个:汇编代码,从机器代码反汇编而来。


    执行'objdump -no-leading-addr -S **.o',第一列将被隐藏。


    objdump --version Apple LLVM 版本 11.0.0 (clang-1100.0.33.17)

    【讨论】:

    • 请注意,除 MacOS 之外的大多数系统都将 objdump 用作 GNU Binutils 版本,其中对应的选项是 --no-addresses。 (还有一个--no-show-raw-insn 选项)。在非 MacOS 上,如果完全安装,LLVM 的 objdump 通常安装为 llvm-objdump
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多