2013-06-11 71 views
0

我发现这个代码:汇编代码:认识LEA命令

lea 0x10(%edi),%esi 
mov %esi,0x4(%edi) 

,但我真的不明白这个组合。

  1. lea-command上堆栈上发生了什么。
  2. 是不是更容易只写:mov 0x10(%edi),0x4(edi%)?

回答

2
  1. 堆栈没有任何反应。
  2. 它可能是,但这不是一个有效的指令。 mov最多支持一个内存操作数。无论如何,你的例子似乎有不同的语义(如下面@zch所提到的)。

您可以获取Intel Software Developers Manuals的副本并阅读所有您想要的内容。

编辑:关于您的问题“%esi?lea写的是计算哪个地址的偏移量?”

esi得到edi + 0x10;那就是0x10(%edi)的含义。 lea代表“加载有效地址”。也就是说,它将edi解释为指针,并将其增加0x10,将结果存储在esi中。

+2

这也意味着不同的事情。写价值,而不是地址。 – zch

+0

2.我明白了,谢谢。但是1.什么值写在%esi中? lea是计算偏移量?哪个地址? –

+0

啊,等一下。简单地写一个0x10到​​%esi只是一个棘手的方法? –

0

在x86汇编使用leamov的是同一种东西,在C/C++,他说:

char *ptr; 
... 
ptr = &val; 

char *ptr; 
... 
*ptr = val; 

lea计算的地址,mov(或其他带有内存操作数的指令)解除引用(访问)它。

所以lea在x86程序集中做什么在C/C++中所谓的“指针算术” - 不涉及内存访问。