我发现这个代码:汇编代码:认识LEA命令
lea 0x10(%edi),%esi
mov %esi,0x4(%edi)
,但我真的不明白这个组合。
- lea-command上堆栈上发生了什么。
- 是不是更容易只写:mov 0x10(%edi),0x4(edi%)?
我发现这个代码:汇编代码:认识LEA命令
lea 0x10(%edi),%esi
mov %esi,0x4(%edi)
,但我真的不明白这个组合。
mov
最多支持一个内存操作数。无论如何,你的例子似乎有不同的语义(如下面@zch所提到的)。您可以获取Intel Software Developers Manuals的副本并阅读所有您想要的内容。
编辑:关于您的问题“%esi?lea写的是计算哪个地址的偏移量?”
esi
得到edi + 0x10
;那就是0x10(%edi)
的含义。 lea
代表“加载有效地址”。也就是说,它将edi
解释为指针,并将其增加0x10,将结果存储在esi
中。
在x86汇编使用lea
与mov
的是同一种东西,在C/C++,他说:
char *ptr;
...
ptr = &val;
与
char *ptr;
...
*ptr = val;
lea
计算的地址,mov
(或其他带有内存操作数的指令)解除引用(访问)它。
所以lea
在x86程序集中做什么在C/C++中所谓的“指针算术” - 不涉及内存访问。
这也意味着不同的事情。写价值,而不是地址。 – zch
2.我明白了,谢谢。但是1.什么值写在%esi中? lea是计算偏移量?哪个地址? –
啊,等一下。简单地写一个0x10到%esi只是一个棘手的方法? –