程序集与C可执行文件大小

时间:2014-02-08 18:00:16

标签: c optimization assembly executable

我在C和x86汇编中编写了两个等效的程序:

.386
.model small
INCLUDELIB MSVCRT
EXTRN _printf:NEAR
.data
msg db "Hello World", 10, 0
.code
main PROC
    push ebp
    mov ebp, esp
    lea eax, msg
    push eax
    call _printf
    add esp, 4
    mov esp, ebp
    pop ebp
    ret 0
main ENDP
END

#include <stdio.h>
int main()
{
    printf("Hello World\n");
    return 0;
}

我用以下程序编译了程序集: ml hello.asm /link /ENTRY:main /SUBSYSTEM:CONSOLE

和C一起: cl /O1 /MD hello.c

/ O1开关应该最小化空间,并且/ MD开关与MSVCRT.LIB链接而不是LIBCMT(这与我的汇编程序中的相同)。

然而,当我检查实际的可执行文件时,C one实际上是程序集大小的两倍:

2014-02-08  10:48 AM             3,072 hello.exe
2014-02-08  10:53 AM             6,144 hello_c.exe

在两者上执行DUMPBIN /DISASM表示程序集只生成我指定的确切指令,而C表示生成数百倍......

有没有人解释为什么要求最小化空间的优化编译器仍会产生比汇编程序更差的结果?

1 个答案:

答案 0 :(得分:2)

我相信它是因为C运行时添加了额外的样板代码。它必须设置 atexit ,命令行参数等。如果您真的很好奇,请使用IDA Pro的免费演示版本(https://www.hex-rays.com/products/ida/support/download_demo.shtml)对它们进行反汇编