汇编和c语言 - 文件大小的比较

时间:2014-02-17 10:39:37

标签: c assembly

我制作了两个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程序

2 个答案:

答案 0 :(得分:4)

这种开销很可能是由于编译器的默认运行时库被包含在内,因为你用它来调用printf()。请注意,printf() 方式功能比您正在调用的the DOS interrupt更强大。所有这些功能当然意味着它包含更多代码。您可以尝试将printf()切换为puts()

我不是说printf()本身就是102 KB,它可能远非如此,但你也得到整个库,它是支持代码(init / de-init,退出处理程序等等) on)而不仅仅是那个功能。

答案 1 :(得分:0)

答案很简单:

编译器开销。

你也使用系统调用,而printf是一个函数调用。