读书人

vc反汇编有关问题rep stos dword pt

发布时间: 2013-10-22 16:16:51 作者: rapoo

vc反汇编问题,rep stos dword ptr es:[edi]表示什么意思?
初学汇编,指令不是很熟悉。

在vc下,看到这个,查命令说rep stos是重复复制指令吧,那么es:[edi]是什么意思呢?
ES = 002B
EDI = 0035F8A4
那我应该在去哪看内存?
2B0+35F8A4么?


virtual int GetNumber(){
008714C0 push ebp
008714C1 mov ebp,esp
008714C3 sub esp,0CCh
008714C9 push ebx
008714CA push esi
008714CB push edi
008714CC push ecx
008714CD lea edi,[ebp-0CCh]
008714D3 mov ecx,33h
008714D8 mov eax,0CCCCCCCCh
008714DD rep stos dword ptr es:[edi] ;就是这里了
008714DF pop ecx
008714E0 mov dword ptr [ebp-8],ecx
return m_nNumber;
008714E3 mov eax,dword ptr [this]
008714E6 mov eax,dword ptr [eax+4]
}
008714E9 pop edi
008714EA pop esi
008714EB pop ebx
008714EC mov esp,ebp
008714EE pop ebp
008714EF ret

[解决办法]
VC里内存查看器直接输入段寄存器就能翻译成段基址,看es:[edi]在内存查看器里输入es + edi就行了。不过你会注意到cs ds ss es其实都是指向0,因为Windows的内存是flat模式的。



引用:
es:[edi]中的es是段超越前缀,在保护模式下,里面装的是selector,edi里面装着偏移,得在selector所指的描述符中找到基址,再加上偏移就是线性地址了。

这些基础知识请自行找一本描述保护模式的书看看。


这里es不是段超越前缀,是stos的默认段寄存器。

读书人网 >C++

热点推荐