【发布时间】:2017-02-09 08:32:51
【问题描述】:
我没有找到关于 objdump 输出的任何文档。 在 objdump -D 输出中,我看到下面的 asm 但我不明白: lea 0x0(%esi,1),%esi
从https://en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax我可以看到“指针”中有4个参数: 段:位移(基址寄存器,偏移寄存器,标量乘数)
但是这个 0x0(%esi,1) 是什么意思呢?标量被省略为 0? 任何人都可以帮助指导我找到 AT&T asm 手册的位置吗?
谢谢, 史蒂文
【问题讨论】:
-
嗯,括号外的数字只能是位移。在括号内,唯一可以是数字的是比例。所以... :) 只是 objdump 很迂腐。
-
当您对单个寄存器使用标量值 1(和位移 0)时,假定指定的寄存器是基数。实际上
lea 0x0(%esi,1),%esi与lea (%esi),%esi相同。您还可以获取objdump以输出您可能更熟悉的 Intel 语法的指令。您可以通过添加选项-Mintel来做到这一点 -
这是一个 3 字节的 NOP,IIRC。
-
@StevenDing:使用了 NOP,因此一些后续指令(通常是跳转的目标)在某个不错的边界对齐以提高性能。
-
@StevenDing :您可能需要再次阅读我所说的内容。我规定“当您使用标量值 1 时”。标量 1 是 AT&T 语法的一个例外,其中第一个参数可以省略。您不能使用 1 以外的标量将其关闭。这是因为乘以 1 实际上并不重要,它是应用于基址寄存器还是偏移寄存器,因为无论哪种方式计算的值都是相同的。这不适用于 2、4、8。如果您使用
0x0(%esi,2)之类的内容,您应该会收到错误消息