【发布时间】:2013-06-11 16:48:54
【问题描述】:
我找到了这段代码:
lea 0x10(%edi),%esi
mov %esi,0x4(%edi)
但我真的不明白这个组合。
- lea 命令的堆栈上究竟发生了什么。
- 写:mov 0x10(%edi),0x4(edi%) 不是更简单吗?
【问题讨论】:
标签: assembly x86 addressing-mode
我找到了这段代码:
lea 0x10(%edi),%esi
mov %esi,0x4(%edi)
但我真的不明白这个组合。
【问题讨论】:
标签: assembly x86 addressing-mode
mov 最多支持一个内存操作数。无论如何,您的示例似乎具有不同的语义(如下面的@zch 所述)。您可以获取Intel Software Developers Manuals 的副本并阅读您想要的所有内容。
编辑:关于您的问题“%esi 中写入了什么值?lea 是计算偏移量?哪个地址的?”
esi 得到edi + 0x10;这就是0x10(%edi) 的意思。 lea 代表“加载有效地址”。也就是说,它将edi解释为一个指针,并将其递增0x10,将结果存储在esi中。
【讨论】:
edi + 0x10 写入esi。我链接到的文档包含您需要了解的所有内容(除了可能将 intel 语法转换为 at&t 语法)。
在 x86 汇编中使用 lea 与 mov 是一样的,在 C/C++ 中,说:
char *ptr;
...
ptr = &val;
对比
char *ptr;
...
*ptr = val;
lea 计算地址,mov(或其他带有内存操作数的指令)取消引用(访问)它。
所以lea 在 x86 汇编中执行 C/C++ 中所谓的“指针算术” - 不涉及内存访问。
【讨论】: