AT&T x86 程序集“lea 0x0(%esi,1),%esi”

Ste*_*ing 1 x86 assembly att

我未能找到有关 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 手册的位置吗?

谢谢,史蒂文

S.M*_*HDI 5

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

lea esi,[esi*1+0x00]
lea esi,[esi]
Run Code Online (Sandbox Code Playgroud)

  • `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]` 相同的结果 (2认同)