我只是在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]和word ptr ds:[0B65740h]。虽然我知道dword ptr是什么意思,但我不明白最后添加的部分,:es和:ds。我已经看过这种语法好几次了,没有人注意到它。
谢谢,
Devjeet
发布于 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帧。
发布于 2011-11-29 10:05:21
ES被隐含为重复字符串操作的目标段,但由于DS和ES在WIN32上保证始终相同,因此ES覆盖是否存在(显式或隐式)并不重要。
https://stackoverflow.com/questions/8304914
复制相似问题