vc反汇编问题,rep stos dword ptr es:[edi]表示什么意思?

getinposition 2013-05-21 06:22:01
初学汇编,指令不是很熟悉。

在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
...全文
672 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
rep stos dword ptr es:[edi] ;这个段寄存器是在es,而008714CD lea edi,[ebp-0CCh] 这个段寄存器是在ss。为什么这样把偏移地址给了edi后就可以直接rep stos dword ptr es:[edi] ;这样,他们两个既然偏移地址一样,那段地址不是不一样吗???
bluewanderer 2013-05-21
  • 打赏
  • 举报
回复
VC里内存查看器直接输入段寄存器就能翻译成段基址,看es:[edi]在内存查看器里输入es + edi就行了。不过你会注意到cs ds ss es其实都是指向0,因为Windows的内存是flat模式的。
引用 1 楼 supermegaboy 的回复:
es:[edi]中的es是段超越前缀,在保护模式下,里面装的是selector,edi里面装着偏移,得在selector所指的描述符中找到基址,再加上偏移就是线性地址了。 这些基础知识请自行找一本描述保护模式的书看看。
这里es不是段超越前缀,是stos的默认段寄存器。
getinposition 2013-05-21
  • 打赏
  • 举报
回复
哦,能推荐一本么?
飞天御剑流 2013-05-21
  • 打赏
  • 举报
回复
es:[edi]中的es是段超越前缀,在保护模式下,里面装的是selector,edi里面装着偏移,得在selector所指的描述符中找到基址,再加上偏移就是线性地址了。 这些基础知识请自行找一本描述保护模式的书看看。

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧