有很多变体如何使用移动,但是它们中的哪个写的是什么?
mov %ecx,0x8(%edi)
- %ecx 中的值与地址 0x8(%edi) 堆叠或 %ecx 中的地址与地址 0x8(%edi) 堆叠?
- 每次都有一个寄存器指向堆栈位置的指针吗?
- (%edi) 和 %edi 之间的区别是,%edi 是地址,(%edi) 是这个地址上的值吗?
有很多变体如何使用移动,但是它们中的哪个写的是什么?
mov %ecx,0x8(%edi)
问题一:价值还是地址?我对你的意思有点困惑,所以我只解释一下mov %ecx, 0x8(%edi)
。in的值 ecx
将存储在内存位置[edi + 8]。因此,如果ecx
保持值 42,则在执行此命令后,您将在内存中的 [edi + 8] 处看到值 42。此代码的 C 等效项是:*(((char*) edi) + 8) = ecx;
问题 2:寄存器可以在堆栈中保持一个位置,但它不是必须的。它可以容纳任何适合它的东西,无论是几个字符,一个整数,一个指针,等等。
问题3: mov (%edi), eax
正在移动内存位置的值edi
。您正在取消引用 edi
. 等效的 C 代码将是eax = *edi
. mov %edi, eax
正在将值移入edi
。等效的 C 代码将是eax = edi
.
注意:请查看 Ol' Wumpus 的评论,了解我未在此处添加的一些重要信息。