【问题标题】:AT&T x86 Assembly "lea 0x0(%esi,1),%esi"AT&T x86 程序集“lea 0x0(%esi,1),%esi”
【发布时间】: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),%esilea (%esi),%esi 相同。您还可以获取objdump 以输出您可能更熟悉的 Intel 语法的指令。您可以通过添加选项 -Mintel 来做到这一点
  • 这是一个 3 字节的 NOP,IIRC。
  • @StevenDing:使用了 NOP,因此一些后续指令(通常是跳转的目标)在某个不错的边界对齐以提高性能。
  • @StevenDing :您可能需要再次阅读我所说的内容。我规定“当您使用标量值 1 时”。标量 1 是 AT&T 语法的一个例外,其中第一个参数可以省略。您不能使用 1 以外的标量将其关闭。这是因为乘以 1 实际上并不重要,它是应用于基址寄存器还是偏移寄存器,因为无论哪种方式计算的值都是相同的。这不适用于 2、4、8。如果您使用 0x0(%esi,2) 之类的内容,您应该会收到错误消息

标签: assembly x86 att


【解决方案1】:

0x0是位移,当等于0时,表示可以省略。 1 是一个刻度,等于 1 时也表示可以省略。所以这条指令lea 0x0(%esi,1),%esi 等同于:

lea esi,[esi*1+0x00]
lea esi,[esi]

【讨论】:

  • 谢谢你,S.MAHDI!现在我明白它与“lea esi,[esi]”相同。所以你的意思是 base register 在这种情况下被省略了,对吧?玛格丽特和迈克尔的另一条评论表明省略的似乎被抵消了?在这一点上似乎很有趣——不同的人有不同的理解,但最终得出了相同的结果。 ;)
  • S.MAHDI 等人,在您的帮助下,我回顾了我的问题中的 GAS_Syntax 页面,现在有了更深入的理解。其内容为:一个或两个数字,任何一个寄存器参数都可以省略。没有基础的例子是 leal 8(,%eax,4), %eax。但是,对于这个,它必须是省略的 offset。谢谢大家~
  • 很高兴我的回答对您有所帮助。
  • lea esi,[esi*1+0x00]lea esi,[esi] 并不完全相同。尽管两者都具有相同的效果-第二个实际上是一条较短的指令,因为不会对 0x00 的位移进行编码。 lea 0x0(%esi,1),%esi 应该发出与lea (%esi),%esi 相同的信号,即lea esi,[esi]lea 0x0(,%esi,1),%esi(注意额外的逗号)应该产生与lea esi,[esi*1+0x00]相同的结果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-23
  • 1970-01-01
  • 2011-10-03
  • 2020-08-01
  • 2014-04-05
  • 2013-06-30
相关资源
最近更新 更多