我在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
提前谢谢。
答案 0 :(得分:3)
该行:
mov eax,dword ptr [edi]
将简单地加载存储在地址edi
中的任何内容。所以这是一个简单的数据加载。
由于您未显示地址edi
(0x6090F434
)的内容,我们无法确切地告诉您eax
将会是什么。
根据给出的C ++代码,看起来edi
是num
字段的地址。所以它将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指令。
希望这可以帮助您更好地理解汇编语言代码。