我找到了这段代码:
lea 0x10(%edi),%esi
mov %esi,0x4(%edi)
但我真的不明白这个组合。
- lea 命令的堆栈上到底发生了什么。
- 写: mov 0x10(%edi),0x4(edi%) 不是更容易吗?
我找到了这段代码:
lea 0x10(%edi),%esi
mov %esi,0x4(%edi)
但我真的不明白这个组合。
mov
最多支持一个内存操作数。无论如何,您的示例似乎具有不同的语义(如下面的@zch 所述)。您可以获取一份英特尔软件开发人员手册并阅读所有您想要的内容。
编辑:关于您的问题“%esi 中写入了什么值?lea 是计算偏移量?哪个地址的?”
esi
得到edi + 0x10
;这就是那个0x10(%edi)
意思。 lea
代表“加载有效地址”。也就是说,它解释edi
为一个指针,并将其递增 0x10,将结果存储在esi
.
在 x86 汇编中使用lea
vs. 与mov
在 C/C++ 中的用法相同,即:
char *ptr;
...
ptr = &val;
对比
char *ptr;
...
*ptr = val;
lea
计算地址,mov
(或其他带有内存操作数的指令)取消引用(访问)它。
在 x86 汇编中也是如此lea
,在 C/C++ 中所谓的“指针算术” - 不涉及内存访问。