我在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表示生成数百倍......
有没有人解释为什么要求最小化空间的优化编译器仍会产生比汇编程序更差的结果?
答案 0 :(得分:2)
我相信它是因为C运行时添加了额外的样板代码。它必须设置 atexit ,命令行参数等。如果您真的很好奇,请使用IDA Pro的免费演示版本(https://www.hex-rays.com/products/ida/support/download_demo.shtml)对它们进行反汇编