【问题标题】:What does e8 00 00 00 00 mean in a disassembled object file? [duplicate]e8 00 00 00 00 在反汇编的目标文件中是什么意思? [复制]
【发布时间】:2020-11-26 17:29:25
【问题描述】:

我知道这些是十六进制指令,但它们通常不是 4 字节长吗?

 f5:    e8 00 00 00 00  callq   0 <main+0xfa>

这是我在运行 objdump --disassemble file.o 时得到的输出中这样一行的一个示例

【问题讨论】:

  • 它的意思是callq 0。不,它们通常不是 4 个字节长。
  • @MichaelPetch 为什么你推荐-D 而不是-d?前者只是将数据部分分解为垃圾,而后者则省略它们。
  • objdump --disassemble -r拆解,给你看重定位条目,你会更好理解。 00 00 00 00 是调用目标的位移。但是 00 00 00 00 是一个占位符,当对象成为可执行文件的一部分时,链接器将填写该占位符。您将看到带有 -r 的重定位条目,并且将有一个用于此调用指令。 x86 具有可变长度指令编码,因此并非所有指令的长度都相同
  • @fuz -D-d 只是我查看时的个人偏好,我不推荐它而不是他们拥有的东西,我的主要目的是为搬迁添加 -r .我实际上错过了他的objdump 命令在问题中,但并不明显,因为他们没有让它脱颖而出。我已经编辑了他们的问题并修改了我的评论。我的评论都是关于搬迁条目的。我已在我的新评论中将-r 添加到 OPs 命令中。
  • @rustyx 1-15 个字节,而不是 1-11 个字节。

标签: c++ linux assembly x86 objdump


【解决方案1】:

您正在为 CISC 处理器(可能是 x86-64)反汇编程序。说明是任意大小的,没有对齐要求。

该指令清楚地将当前地址压入堆栈;虽然这是一个.o 文件,但它也可能是一个外部调用,必须获取链接器修补的真实地址。

【讨论】:

  • 请注意,RISC 处理器也可以有可变长度指令。 RISC-V 和 ARM 就是两个例子。单独的指令编码并不能使处理器成为 CISC,尽管我确实发现整个 RISC/CISC 二分法非常荒谬。
  • @fuz:如果你知道一个指令长度奇数的 RISC 处理器,我想知道。
  • 嗯,我不知道有任何支持奇数大小的指令长度,但 ARM Thumb2 确实支持 2、4 和 6 字节指令(如果您将 IT 算作前缀,它意味着被解码为)。 RISC 法律是否禁止制作字节大小的指令?
  • @fuz:我只是将奇数指令的存在作为一个非常快速的经验法则,因为它必须是一个 CISC 处理器,因为它到目前为止从未失败过。
  • CISC vs RISC 并不是一个真正的原因,这只是一个指令集以另一种方式工作的情况。 ARM 被固定了很长时间,然后 thumb 出现了,所以你有两个指令集,它们在这些模式中是固定的,然后 thumb2 使 thumb 长度可变。 OP 似乎确实对学习一个固定长度的指令感到困惑(也许 mips 也有 2 和 4 字节指令,如 arm)并假设世界其他地方的工作方式相同。
猜你喜欢
  • 2017-11-25
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 2021-08-10
  • 2016-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多