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

Assembly 在mov eax、dword ptr[edi]之后,eax有什么,assembly,Assembly,我在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必须具有该值,但我对此不太确定。 有关您的信

我在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

提前感谢。

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


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

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

这似乎是显而易见的,所以我想知道这是否真的是你想知道的

mov eax,dword ptr [edi]
只需加载存储在地址
edi
中的任何内容。所以这是一个简单的数据加载

由于您没有显示地址
edi
0x6090F434
)中的内容,因此我们无法准确地告诉您eax将是什么

基于给出的C++代码,看起来像<代码> EDI<代码>是<代码> Num 字段的地址。因此,它将

num
读入寄存器,然后将其与
0xFFFFFFFF
进行比较,后者是
无效标志
常量。

行:

mov eax,dword ptr [edi]
只需加载存储在地址
edi
中的任何内容。所以这是一个简单的数据加载

由于您没有显示地址
edi
0x6090F434
)中的内容,因此我们无法准确地告诉您eax将是什么


基于给出的C++代码,看起来像<代码> EDI<代码>是<代码> Num 字段的地址。因此,它将

num
读入寄存器,然后将其与
0xffffff
进行比较,后者是
无效标志
常量。

以下是对您发布的汇编代码的描述:

mov eax,dword ptr [edi] 
将edi寄存器中包含的内存地址中存储的值移到eax寄存器中

edi寄存器的windbg输出显示:

6090f454 0c0e8fe0 FFFFFFFF00000000

这里的第一个值是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寄存器中

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

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

最后的指示

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

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

因此,在cmp指令之后可以有一个jz或jnz指令


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

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

mov eax,dword ptr [edi] 
将edi寄存器中包含的内存地址中存储的值移到eax寄存器中

edi寄存器的windbg输出显示:

6090f454 0c0e8fe0 FFFFFFFF00000000

这里的第一个值是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寄存器中

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

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

最后的指示

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

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

因此,在cmp指令之后可以有一个jz或jnz指令


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

是的,我只想知道这些。非常感谢。是的,我只想知道这些。非常感谢。我写edi的时候有打字错误。edi实际上是6090f454。这是edi中存储的内容。6090f454 0c0e8fe0 FFFFFFFF00000000 00000000等待,这没有任何意义,
edi
只有32位。它无法存储所有的
6090f454 0c0e8fe0 FFFFFFFFFF00000000000000
。这只是一个寄存器转储吗?很抱歉搞混了。我对原始问题进行了编辑,以便更清楚。谢谢。我不熟悉那个调试器,但是假设
0ce8fe0 ffffff00000000000000
edi
指向的数据,那么指令将
0ce8fe0
加载到
eax
中。换句话说,
sem->num=0c0e8fe0
。当我写edi时,有输入错误。edi实际上是6090f454。这是edi中存储的内容。6090f454 0c0e8fe0 FFFFFFFF00000000 00000000等待,这没有任何意义,
edi
只有32位。它无法存储所有的
6090f454 0c0e8fe0 FFFFFFFFFF00000000000000
。那只是一张注册卡吗