在eax之后eax有什么,dword ptr [edi]

时间:2012-01-11 18:51:09

标签: assembly

我在Windows上有以下汇编代码,我想确保我理解正确。 edi包含一些地址,即0x6090F454

在这种情况下,eax指令后mov应该有什么?

775672f3  mov eax,dword ptr [edi]

775672f5  mov dword ptr [ebp-50h],0 
775672fc  mov dword ptr [ebp-48h],0 

77567303  cmp eax,0FFFFFFFFh 

在我看来,eax必须具有价值,但我对此不太确定。 为了您的信息,上面的程序集的C ++代码是

if (sem->num != INVALID_FLAG) {
    ....
}

此外,这是edi中的商店。

0:024> dd edi
6090f454  0c0e8fe0 ffffffff 00000000 00000000

提前谢谢。

3 个答案:

答案 0 :(得分:3)

该行:

mov eax,dword ptr [edi]

将简单地加载存储在地址edi中的任何内容。所以这是一个简单的数据加载。

由于您未显示地址edi0x6090F434)的内容,我们无法确切地告诉您eax将会是什么。

根据给出的C ++代码,看起来edinum字段的地址。所以它将num读入寄存器,然后将其与0xFFFFFFFF INVALID_FLAG常量进行比较。

答案 1 :(得分:2)

EAX将包含32位值0x6090F434,假设该地址为“存在”,即将内存分配给该地址的进程。

这似乎很明显,所以我想知道这是不是你想知道的?

答案 2 :(得分:1)

以下是您发布的汇编代码的说明:

mov eax,dword ptr [edi] 

将存储在edi寄存器中包含的存储器地址中的值移动到eax寄存器。

edi寄存器的windbg输出显示:

6090f454 0c0e8fe0 ffffffff 00000000 00000000

这里的第一个值是edi寄存器中包含的存储器地址。下一个值0c0e8fe0是位于该存储器地址的双字。

理解和可视化的更简单方法是:

dword ptr [edi] =  0c0e8fe0
dword ptr [edi+4] = ffffffff
dword ptr [edi+8] = 00000000

因此,dd命令显示第一列中的地址和接下来的4列中的dword数据。

汇编语言指令

mov eax, dword ptr [edi] 

将值0c0e8fe0移入eax寄存器。

类似地,汇编语言代码中的下两条指令将值0存储在ebp-50和ebp-48指向的内存地址。

通常,[ebp-4],[ebp-8]等用于引用程序中的局部变量。

最后一条指令,

cmp eax,0FFFFFFFFh

比较存储在eax寄存器中的dword,即0c0e8fe0和0FFFFFFFFh。在这种情况下,值不相等,因此不会设置零标志。

通常在汇编语言代码中,cmp指令之后是条件跳转,它检查标志状态。

因此,您可以在cmp指令之后使用jz或jnz指令。

希望这可以帮助您更好地理解汇编语言代码。