【发布时间】:2010-08-13 23:00:13
【问题描述】:
lea 0x4(%esp),%ecx 在 at&t 汇编中是什么意思?
0x4(%esp) 到底是什么?
【问题讨论】:
lea 0x4(%esp),%ecx 在 at&t 汇编中是什么意思?
0x4(%esp) 到底是什么?
【问题讨论】:
我是%esp + 0x4。
LEA 代表加载有效地址。在这种情况下,这是一个简单的添加,如上所示。通常,人们和编译器不再真正使用它,因为 CPU 现在带有一个漂亮的地址生成单元(也称为 AGU),它允许您使用各种花哨的算法从寄存器和值计算地址。简而言之,无论您对 lea 做了什么,您现在都可以将其嵌入到任何其他指令中。
【讨论】:
lea 指令仅占为我目前正在处理的代码生成的所有指令的不到 10%。确实,在 x86 上,您可以在加载或存储操作中嵌入任何 lea 操作(老实说,我对此表示怀疑),但代码仍然充满了不一定涉及加载或存储的指针运算。
eax << (edx*2 +1),我想要lea 1(%edx,%edx), %ecx; shl %cl, %eax。我无法编写一条 shl 指令,从某个预移位中获取 EAX 的移位计数并添加 EDX。
lea ecx,[esp+4]
【讨论】:
esp 是堆栈指针。 0x4 是偏移量。 AT&T 语法有command source, destination,这里的命令是LEA,即“加载有效地址”。
所以我们告诉 CPU 将地址“堆栈指针 + 4”加载到寄存器“ecx”中
【讨论】: