Assembly 美国电话电报公司;T x86组件“;lea 0x0(%esi,1),%esi";

Assembly 美国电话电报公司;T x86组件“;lea 0x0(%esi,1),%esi";,assembly,x86,att,Assembly,X86,Att,我找不到关于objdump输出的任何文档。 在objdump-D输出中,我看到了下面的asm,但我不理解它: lea 0x0(%esi,1),%esi 从中可以看出,“指针”中有4个参数: 段:位移(基址寄存器、偏移寄存器、标量乘法器) 但是这个0x0(%esi,1)是什么意思?标量被省略为0? 还有谁能告诉我AT&T asm手册的位置 谢谢, Steven0x0是一个位移,当它等于零时,意味着可以忽略它1是一个刻度,当它等于1时,意味着它也可以省略。因此,此指令lea0x0(%esi,1),%

我找不到关于objdump输出的任何文档。 在objdump-D输出中,我看到了下面的asm,但我不理解它: lea 0x0(%esi,1),%esi

从中可以看出,“指针”中有4个参数: 段:位移(基址寄存器、偏移寄存器、标量乘法器)

但是这个0x0(%esi,1)是什么意思?标量被省略为0? 还有谁能告诉我AT&T asm手册的位置

谢谢,
Steven

0x0
是一个位移,当它等于零时,意味着可以忽略它
1
是一个刻度,当它等于1时,意味着它也可以省略。因此,此指令
lea0x0(%esi,1),%esi
与以下指令相同:

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

0x0
是一个位移,当它等于零时,意味着可以忽略它
1
是一个刻度,当它等于1时,意味着它也可以省略。因此,此指令
lea0x0(%esi,1),%esi
与以下指令相同:

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


括号外的数字只能是位移。在括号内,唯一可以成为数字的是刻度。所以…:)这只是objdump太迂腐了。当使用单个寄存器的标量值1(位移为0)时,假定指定的寄存器是基址。实际上,
lea0x0(%esi,1),%esi
lea(%esi),%esi
是一样的。您还可以获取
objdump
,以使用您可能更熟悉的英特尔语法输出指令。您可以通过添加选项
-Mintel
来实现这一点,该选项是一个3字节的NOP,IIRC。@StevenDing:使用NOP是为了使一些后续指令(通常是跳转的目标)在某个良好的边界上对齐,以提高性能。@StevenDing:您可能需要再次阅读我所说的内容。我规定“当使用标量值1时”。标量为1是AT&T语法的一个例外,其中第一个参数可以省略。你不能用1以外的标量。这是因为乘以1实际上并不重要,它是应用于基址寄存器还是偏移寄存器,因为无论哪种方式,计算值都是相同的。这不适用于2,4,8。如果使用类似于
0x0(%esi,2)
的内容,则应该会出现错误。好的,括号外的数字只能是位移。在括号内,唯一可以成为数字的是刻度。所以…:)这只是objdump太迂腐了。当使用单个寄存器的标量值1(位移为0)时,假定指定的寄存器是基址。实际上,
lea0x0(%esi,1),%esi
lea(%esi),%esi
是一样的。您还可以获取
objdump
,以使用您可能更熟悉的英特尔语法输出指令。您可以通过添加选项
-Mintel
来实现这一点,该选项是一个3字节的NOP,IIRC。@StevenDing:使用NOP是为了使一些后续指令(通常是跳转的目标)在某个良好的边界上对齐,以提高性能。@StevenDing:您可能需要再次阅读我所说的内容。我规定“当使用标量值1时”。标量为1是AT&T语法的一个例外,其中第一个参数可以省略。你不能用1以外的标量。这是因为乘以1实际上并不重要,它是应用于基址寄存器还是偏移寄存器,因为无论哪种方式,计算值都是相同的。这不适用于2,4,8。如果您使用类似于
0x0(%esi,2)
谢谢您,S.MAHDI,您应该会得到一个错误!现在我明白了,这和“leaesi,[esi]”是一样的。你的意思是基址寄存器在这种情况下被省略了,对吗?玛格丽特和迈克尔的另一条评论指出,遗漏的一条似乎被抵消了?在这一点上似乎很有趣——不同的人有不同的理解,但最终得到相同的结果在您的帮助下,我回顾了问题中的GAS_语法页面,现在有了更深的理解。它的内容是:两个数字中的一个或两个,寄存器参数中的任何一个都可以省略。一个没有基的例子是leal8(,%eax,4),%eax。但是,对于这一个,必须忽略偏移量。谢谢大家~很高兴我的回答帮助了你们。
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]
相同的结果,谢谢你,S.MAHDI!现在我明白了,这和“leaesi,[esi]”是一样的。你的意思是基址寄存器在这种情况下被省略了,对吗?玛格丽特和迈克尔的另一条评论指出,遗漏的一条似乎被抵消了?在这一点上似乎很有趣——不同的人有不同的理解,但最终得到相同的结果在您的帮助下,我回顾了问题中的GAS_语法页面,现在有了更深的理解。它的内容是:两个数字中的一个或两个,寄存器参数中的任何一个都可以省略。一个没有基的例子是leal8(,%eax,4),%eax。但是,对于这一个,必须忽略偏移量。谢谢大家~很高兴我的回答帮助了你们。
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(注意额外的逗号)应产生