我在CodeBlocks上运行调试器并查看了反汇编窗口.
我调试的程序的完整源代码如下:
int main(){}
我在窗口中看到的汇编代码是:
00401020 push %ebp 00401021 mov %esp,%ebp 00401023 push %ebx 00401024 sub $0x34,%esp 00401027 movl $0x401150,(%esp) 0040102E call 0x401984 <SetUnhandledExceptionFilter@4> 00401033 sub $0x4,%esp 00401036 call 0x401330 <__cpu_features_init> 0040103B call 0x401740 <fpreset> 00401040 lea -0x10(%ebp),%eax 00401043 movl $0x0,-0x10(%ebp) 0040104A mov %eax,0x10(%esp) 0040104E mov 0x402000,%eax 00401053 movl $0x404004,0x4(%esp) 0040105B movl $0x404000,(%esp) 00401062 mov %eax,0xc(%esp) 00401066 lea -0xc(%ebp),%eax 00401069 mov %eax,0x8(%esp) 0040106D call 0x40192c <__getmainargs> 00401072 mov 0x404008,%eax 00401077 test %eax,%eax 00401079 jne 0x4010c5 <__mingw_CRTStartup+165> 0040107B call 0x401934 <__p__fmode> 00401080 mov 0x402004,%edx 00401086 mov %edx,(%eax) 00401088 call 0x4014f0 <_pei386_runtime_relocator> 0040108D and $0xfffffff0,%esp 00401090 call 0x401720 <__main> 00401095 call 0x40193c <__p__environ> 0040109A mov (%eax),%eax 0040109C mov %eax,0x8(%esp) 004010A0 mov 0x404004,%eax 004010A5 mov %eax,0x4(%esp) 004010A9 mov 0x404000,%eax 004010AE mov %eax,(%esp) 004010B1 call 0x401318 <main> 004010B6 mov %eax,%ebx 004010B8 call 0x401944 <_cexit> 004010BD mov %ebx,(%esp) 004010C0 call 0x40198c <ExitProcess@4> 004010C5 mov 0x4050f4,%ebx 004010CB mov %eax,0x402004 004010D0 mov %eax,0x4(%esp) 004010D4 mov 0x10(%ebx),%eax 004010D7 mov %eax,(%esp) 004010DA call 0x40194c <_setmode> 004010DF mov 0x404008,%eax 004010E4 mov %eax,0x4(%esp) 004010E8 mov 0x30(%ebx),%eax 004010EB mov %eax,(%esp) 004010EE call 0x40194c <_setmode> 004010F3 mov 0x404008,%eax 004010F8 mov %eax,0x4(%esp) 004010FC mov 0x50(%ebx),%eax 004010FF mov %eax,(%esp) 00401102 call 0x40194c <_setmode> 00401107 jmp 0x40107b <__mingw_CRTStartup+91> 0040110C lea 0x0(%esi,%eiz,1),%esi
解决方法
是的,这是相当典型的启动/关闭代码.
在主要运行之前,需要做一些事情:
> stdin / stdout / stderr打开
> cin / cout / cerr / clog打开,引用stdin / stdout / stderr
>您定义的任何静态对象都被初始化
>命令行被解析生成argc / argv
>环境得到检索(也许)
同样,在你的主要退出之后,还有一些事情不得不发生:
>用atexit设置的任何东西都可以运行
>您的静态对象被破坏
> cin / cout / cerr / clog被破坏
>所有打开的输出流都被清空并关闭
>所有打开的输入流都关闭
根据平台,还可能有更多的事情,例如设置一些默认异常处理程序(对于C异常,某些特定于平台的异常或两者).
请注意,大多数这是固定的代码,它被链接到基本上每个程序,无论它是什么或不包含.在理论上,它们可以使用一些技巧(例如“弱外部”),以避免在不需要时在某些代码中进行链接,但上面的大部分都被普遍使用(并且处理它的代码是很简单),即使不会使用(就像你的情况,根本没有使用的东西),很难打扰去做任何工作来消除这一点代码.
请注意,您所显示的是启动/关闭代码.它链接到您的程序中,传统上来自名为crt0的文件(以及可能还有一些其他文件).
如果您查看文件中的主要代码生成的代码,您可能会发现它的时间要短得多 – 可能只是简单而简单.它可能是如此之小,以至于你错过了一切事实.