0

有很多变体如何使用移动,但是它们中的哪个写的是什么?

mov %ecx,0x8(%edi)
  1. %ecx 中的值与地址 0x8(%edi) 堆叠或 %ecx 中的地址与地址 0x8(%edi) 堆叠?
  2. 每次都有一个寄存器指向堆栈位置的指针吗?
  3. (%edi) 和 %edi 之间的区别是,%edi 是地址,(%edi) 是这个地址上的值吗?
4

1 回答 1

1

问题一:价值还是地址?我对你的意思有点困惑,所以我只解释一下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 的评论,了解我未在此处添加的一些重要信息。

于 2013-06-11T22:39:40.533 回答