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



我用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 Worldn");
    return 0;
}

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

而C的则具有: cl /O1 /MD hello.c

/

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

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

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

对两者进行DUMPBIN /DISASM表明,程序集仅生成我指定的确切指令,而 C 程序集生成的指令要多数百倍......

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

我相信

这是因为 C 运行时添加了额外的样板代码。它必须设置在退出,命令行参数等。如果您真的很好奇,请使用 IDA Pro 的免费演示版 (https://www.hex-rays.com/products/ida/support/download_demo.shtml) 拆解它们

相关内容

最新更新