首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >eax在mov eax,dword ptr之后有什么[edi]

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

Stack Overflow用户
提问于 2012-01-12 02:51:09
回答 3查看 12.3K关注 0票数 1

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

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

代码语言:javascript
复制
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++代码为

代码语言:javascript
复制
if (sem->num != INVALID_FLAG) {
    ....
}

此外,这是存储在edi中的内容。

代码语言:javascript
复制
0:024> dd edi
6090f454  0c0e8fe0 ffffffff 00000000 00000000

提前谢谢你。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-12 02:56:18

这行代码:

代码语言:javascript
复制
mov eax,dword ptr [edi]

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

由于您没有显示address edi (0x6090F434)中的内容,因此我们不能确切地告诉您eax将是什么。

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

票数 3
EN

Stack Overflow用户

发布于 2012-01-12 02:55:57

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

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

票数 2
EN

Stack Overflow用户

发布于 2012-02-03 01:24:59

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

代码语言:javascript
复制
mov eax,dword ptr [edi] 

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

edi寄存器的windbg输出显示:

6090f454 0c0e8fe0 ffffffff 00000000 00000000

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

一种更容易理解和可视化的方法是:

代码语言:javascript
复制
dword ptr [edi] =  0c0e8fe0
dword ptr [edi+4] = ffffffff
dword ptr [edi+8] = 00000000

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

汇编语言指令,

代码语言:javascript
复制
mov eax, dword ptr [edi] 

将值0c0e8fe0移动到eax寄存器中。

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

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

最后一条指令,

代码语言:javascript
复制
cmp eax,0FFFFFFFFh

比较存储在eax寄存器中的dword,即0c0e8fe0与0FFFFFFFh。在这种情况下,这些值不相等,因此不会设置Zero Flag。

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

因此,cmp指令后面可以有一条jz或jnz指令。

希望这能帮助你更好地理解汇编语言代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8824937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档