首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dword ptr和dword ptr之间的差异:es

dword ptr和dword ptr之间的差异:es
EN

Stack Overflow用户
提问于 2011-11-29 09:58:08
回答 2查看 3.4K关注 0票数 1

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

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

有问题的行是:

代码语言:javascript
复制
00B613BC  rep stos    dword ptr es:[edi]  

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

我不明白他们为什么要用dword ptr es:[edi]word ptr ds:[0B65740h]。虽然我知道dword ptr是什么意思,但我不明白最后添加的部分,:es:ds。我已经看过这种语法好几次了,没有人注意到它。

谢谢,

Devjeet

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-29 12:41:23

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

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

票数 6
EN

Stack Overflow用户

发布于 2011-11-29 10:05:21

ES被隐含为重复字符串操作的目标段,但由于DS和ES在WIN32上保证始终相同,因此ES覆盖是否存在(显式或隐式)并不重要。

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

https://stackoverflow.com/questions/8304914

复制
相关文章

相似问题

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