谁有兴趣解释一下Visual Studio生成的汇编代码?

hydream 2005-12-09 10:47:17
在调试中,反编译的代码如下:
我一直有点纳闷的是:
为什么所有的函数都要在开始的时候多分配那么多空间呢?
例如以下这个代码中,只有一个局部变量 p ,按理说只需要4个字节就够了啊,为什么要
分配D8h个空间了,未免太乱费了吧?
int _tmain(int argc, _TCHAR* argv[])
{
00411C40 55 push ebp
00411C41 8B EC mov ebp,esp
00411C43 81 EC D8 00 00 00 sub esp,0D8h //就是这里,为什么要分配这么多空间呢?
00411C49 53 push ebx
00411C4A 56 push esi
00411C4B 57 push edi
00411C4C 8D BD 28 FF FF FF lea edi,[ebp+FFFFFF28h]
00411C52 B9 36 00 00 00 mov ecx,36h
00411C57 B8 CC CC CC CC mov eax,0CCCCCCCCh
00411C5C F3 AB rep stos dword ptr [edi]
C *p=new C;
00411C5E 6A 01 push 1
00411C60 E8 E6 F8 FF FF call 0041154B
00411C65 83 C4 04 add esp,4
00411C68 89 85 2C FF FF FF mov dword ptr [ebp+FFFFFF2Ch],eax
00411C6E 8B 85 2C FF FF FF mov eax,dword ptr [ebp+FFFFFF2Ch]
00411C74 89 45 F8 mov dword ptr [ebp-8],eax
p->f();
00411C77 8B 4D F8 mov ecx,dword ptr [ebp-8]
00411C7A E8 48 F5 FF FF call 004111C7
}

当然,我还发现所有的函数都是这样,分配的空间要远远多于所需要的空间。有谁能帮我解答一下没有?谢谢各位了。
...全文
277 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
pankun 2005-12-10
  • 打赏
  • 举报
回复
因为你看的是DEBUG版本汇编代码,VC为了调试方便,自已加了一些东西.

另外你说"在C++中如果调用一个方法,例如AObject.Func();则和调用普通的函数Func()的唯一区别是在EAX中传入Self."
这个不一定,参数传递是要看你是什么调用约定,另外虚函数调用也和普通函数不一样的
hydream 2005-12-10
  • 打赏
  • 举报
回复
噢?那好吧,我去看一下release版的反汇编代码.
hydream 2005-12-09
  • 打赏
  • 举报
回复
在C++中如果调用一个方法,例如AObject.Func();则和调用普通的函数Func()的唯一区别是在EAX中传入Self.
hydream 2005-12-09
  • 打赏
  • 举报
回复
还有就是C++中的对象的方法调用是4个字节,而 Delphi中是8个字节。

请问是不是这样啊?
hydream 2005-12-09
  • 打赏
  • 举报
回复
在调试中,反编译的代码如下:
我一直有点纳闷的是:
为什么所有的函数都要在开始的时候多分配那么多空间呢?
例如以下这个代码中,只有一个局部变量 p ,按理说只需要4个字节就够了啊,为什么要
分配D8h个空间了,未免太乱费了吧?
int _tmain(int argc, _TCHAR* argv[])
{
00411C40 55 push ebp
00411C41 8B EC mov ebp,esp
00411C43 81 EC D8 00 00 00 sub esp,0D8h //就是这里,为什么要分配这么多空间呢?
00411C49 53 push ebx
00411C4A 56 push esi
00411C4B 57 push edi
00411C4C 8D BD 28 FF FF FF lea edi,[ebp+FFFFFF28h]
00411C52 B9 36 00 00 00 mov ecx,36h
00411C57 B8 CC CC CC CC mov eax,0CCCCCCCCh
00411C5C F3 AB rep stos dword ptr [edi]
C *p=new C;
00411C5E 6A 01 push 1
00411C60 E8 E6 F8 FF FF call 0041154B
00411C65 83 C4 04 add esp,4
00411C68 89 85 2C FF FF FF mov dword ptr [ebp+FFFFFF2Ch],eax
00411C6E 8B 85 2C FF FF FF mov eax,dword ptr [ebp+FFFFFF2Ch]
00411C74 89 45 F8 mov dword ptr [ebp-8],eax
p->f();
00411C77 8B 4D F8 mov ecx,dword ptr [ebp-8]
00411C7A E8 48 F5 FF FF call 004111C7
}

当然,我还发现所有的函数都是这样,分配的空间要远远多于所需要的空间。有谁能帮我解答一下没有?谢谢各位了。

21,496

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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