dword ptr 和 dword ptr:es 之间的区别

2023-12-12

我只是在 VS2010 中检查我的 C++ 程序的反汇编。这里是 :

int main()
{
00B613A0  push        ebp  
00B613A1  mov         ebp,esp  
00B613A3  sub         esp,0D4h  
00B613A9  push        ebx  
00B613AA  push        esi  
00B613AB  push        edi  
00B613AC  lea         edi,[ebp-0D4h]  
00B613B2  mov         ecx,35h  
00B613B7  mov         eax,0CCCCCCCCh  
00B613BC  rep stos    dword ptr es:[edi]  
00B613BE  mov         eax,dword ptr [___security_cookie (0B67000h)]  
00B613C3  xor         eax,ebp  
00B613C5  mov         dword ptr [ebp-4],eax  
    char temp[] = "hello";
00B613C8  mov         eax,dword ptr [string "hello" (0B6573Ch)]  
00B613CD  mov         dword ptr [ebp-10h],eax  
00B613D0  mov         cx,word ptr ds:[0B65740h]  
00B613D7  mov         word ptr [ebp-0Ch],cx  

    return 0;
00B613DB  xor         eax,eax  
}

有问题的行是:

00B613BC  rep stos    dword ptr es:[edi]  

00B613D0  mov         cx,word ptr ds:[0B65740h] 

我不明白他们为什么使用dword ptr es:[edi] and word ptr ds:[0B65740h]。虽然我知道 dword ptr 的含义,但我不明白添加的最后一部分,:es and :ds。我已经多次看到这种语法了,以至于没有注意到它。

Thanks,

Devjeet


这些只是反汇编程序的产物。 ES段寄存器已经是STOS指令使用的默认段寄存器,DS段寄存器已经是该MOV指令使用的默认段寄存器。很难称其为错误,但它肯定是不必要的并且应用不一致。我认为这是由 STOS 指令的 REP 前缀和 MOV 指令的操作数大小前缀(16 位而不是 8 或 32 位)触发的。段覆盖也是一个前缀。

32位代码使用平面内存模型,ES、DS、CS和SS段寄存器映射整个4GB地址空间。因此几乎没有理由需要覆盖段寄存器。与 16 位代码非常不同,在 16 位代码中,段寄存器对于允许寻址超过 64 KB 的内存非常重要。您将在异常处理代码中看到 FS 寄存器的段覆盖。它指向线程信息块,FS:[0]包含当前的SEH帧。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

dword ptr 和 dword ptr:es 之间的区别 的相关文章

随机推荐