我用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) 拆解它们