0

我找到了这段代码:

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

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

  1. lea 命令的堆栈上到底发生了什么。
  2. 写: mov 0x10(%edi),0x4(edi%) 不是更容易吗?
4

2 回答 2

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

您可以获取一份英特尔软件开发人员手册并阅读所有您想要的内容。

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

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

于 2013-06-11T16:52:23.747 回答
0

在 x86 汇编中使用leavs. 与mov在 C/C++ 中的用法相同,即:

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

对比

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

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

在 x86 汇编中也是如此lea,在 C/C++ 中所谓的“指针算术” - 不涉及内存访问。

于 2013-06-14T15:02:20.430 回答