C CodeBlocks拆卸;方式太多代码?

前端之家收集整理的这篇文章主要介绍了C CodeBlocks拆卸;方式太多代码?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在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

从这么少的C代码获取这么多的汇编代码是否正常?

通常,我的意思是这个接近于MinGw编译器生成的汇编代码的平均数量,相对于我上面提供的C源代码数量

解决方法

是的,这是相当典型的启动/关闭代码.

在主要运行之前,需要做一些事情:

> stdin / stdout / stderr打开
> cin / cout / cerr / clog打开,引用stdin / stdout / stderr
>您定义的任何静态对象都被初始化
>命令行被解析生成argc / argv
>环境得到检索(也许)

同样,在你的主要退出之后,还有一些事情不得不发生:

>用atexit设置的任何东西都可以运行
>您的静态对象被破坏
> cin / cout / cerr / clog被破坏
>所有打开的输出流都被清空并关闭
>所有打开的输入流都关闭

根据平台,还可能有更多的事情,例如设置一些默认异常处理程序(对于C异常,某些特定于平台的异常或两者).

请注意,大多数这是固定的代码,它被链接到基本上每个程序,无论它是什么或不包含.在理论上,它们可以使用一些技巧(例如“弱外部”),以避免在不需要时在某些代码中进行链接,但上面的大部分都被普遍使用(并且处理它的代码是很简单),即使不会使用(就像你的情况,根本没有使用的东西),很难打扰去做任何工作来消除这一点代码.

请注意,您所显示的是启动/关闭代码.它链接到您的程序中,传统上来自名为crt0的文件(以及可能还有一些其他文件).

如果您查看文件中的主要代码生成代码,您可能会发现它的时间要短得多 – 可能只是简单而简单.它可能是如此之小,以至于你错过了一切事实.

原文链接:https://www.f2er.com/c/112989.html

猜你在找的C&C++相关文章