我制作了两个hello-world程序 - 一个在x86程序集中使用CMD中的调试器,另一个在c语言中。
由于汇编语言向CPU提供了非常精确的指令,因此可执行文件在内存中占用的字节数少于可执行的c文件就不足为奇了。但我感到惊讶的是,差异非常巨大:如下所示:
hello world in x86 assembly: 30 bytes
hello world in c-language: 102 kb
那就是 - c程序是汇编程序的3400倍。
我首先想到的可以通过在此上下文 stdio.h 中包含头文件来解释,但是在没有它的情况下进行编译时,文件大小只减少到95KB。
所以 - 我的问题是 - 是什么让c文件的字节数比汇编文件重得多?难道这个可执行文件依赖于某些dll文件吗?
x86汇编代码:
jmp 115
db 'Hello world!$'
-a 115
mov ah, 09
mov dx, 102
int 21
int 20
c代码:
#include <stdio.h>
int main(void) {
printf("Hello world!");
}
使用默认选项
,使用MinGW编译c程序答案 0 :(得分:4)
这种开销很可能是由于编译器的默认运行时库被包含在内,因为你用它来调用printf()
。请注意,printf()
方式功能比您正在调用的the DOS interrupt更强大。所有这些功能当然意味着它包含更多代码。您可以尝试将printf()
切换为puts()
。
我不是说printf()
本身就是102 KB,它可能远非如此,但你也得到整个库,它是支持代码(init / de-init,退出处理程序等等) on)而不仅仅是那个功能。
答案 1 :(得分:0)
答案很简单:
编译器开销。
你也使用系统调用,而printf是一个函数调用。