Assembly 在mov eax、dword ptr[edi]之后,eax有什么
我在Windows上有以下汇编代码,我想确保我理解正确。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必须具有该值,但我对此不太确定。 有关您的信
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
。那只是一张注册卡吗