我在Windows上有以下汇编代码,我想确保我理解正确。edi包含一些地址,即0x6090F454
在这种情况下,在第一条mov指令之后,eax应该有什么?
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提前谢谢你。
发布于 2012-01-12 02:56:18
这行代码:
mov eax,dword ptr [edi]将简单地加载存储在地址edi中的任何内容。所以这是一个简单的数据加载。
由于您没有显示address edi (0x6090F434)中的内容,因此我们不能确切地告诉您eax将是什么。
根据给定的C++代码,看起来edi是num字段的地址。所以它将num读入一个寄存器,然后将其与INVALID_FLAG常量0xFFFFFFFF进行比较。
发布于 2012-01-12 02:55:57
EAX将包含地址为0x6090F434的32位值,假设地址为'exists‘,即内存分配给该地址的进程。
这似乎很明显,所以我想知道这是否真的是你想知道的?
发布于 2012-02-03 01:24:59
以下是您发布的汇编代码的说明:
mov eax,dword ptr [edi] 将edi寄存器中包含的存储器地址中存储的值移动到eax寄存器。
edi寄存器的windbg输出显示:
6090f454 0c0e8fe0 ffffffff 00000000 00000000
这里的第一个值是edi寄存器中包含的内存地址。下一个值0c0e8fe0是位于该存储器地址的dword。
一种更容易理解和可视化的方法是:
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与0FFFFFFFh。在这种情况下,这些值不相等,因此不会设置Zero Flag。
通常在汇编语言代码中,cmp指令后面是检查标志状态的条件跳转。
因此,cmp指令后面可以有一条jz或jnz指令。
希望这能帮助你更好地理解汇编语言代码。
https://stackoverflow.com/questions/8824937
复制相似问题