汇编语言和c语言-文件大小的比较
我制作了两个hello world程序——一个是在x86汇编中使用CMD中的调试器,另一个是在c语言中 由于汇编语言向CPU提供非常精确的指令,因此可执行文件在内存中所占的字节数少于可执行c文件也就不足为奇了。但令我惊讶的是,两者之间的差异实在太大了:下面是:汇编语言和c语言-文件大小的比较,c,assembly,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倍 我首先认为可以通过在上下文中包含headerfil
hello world in x86 assembly: 30 bytes
hello world in c-language: 102 kb
也就是说,c程序是汇编程序的3400倍
我首先认为可以通过在上下文中包含headerfile来解释它,但是在没有它的情况下编译时,文件大小仅减少到95KB
那么-我的问题是-是什么使得c文件比汇编文件在字节上重得多?此可执行文件是否依赖于某些dll文件
x86汇编代码:
jmp 115
db 'Hello world!$'
-a 115
mov ah, 09
mov dx, 102
int 21
int 20
#include <stdio.h>
int main(void) {
printf("Hello world!");
}
c代码:
jmp 115
db 'Hello world!$'
-a 115
mov ah, 09
mov dx, 102
int 21
int 20
#include <stdio.h>
int main(void) {
printf("Hello world!");
}
#包括
内部主(空){
printf(“你好,世界!”);
}
c程序使用MinGW编译,使用默认选项答案非常简单: 编译器开销
您还可以使用syscalls,printf是一个函数调用。答案非常简单: 编译器开销
您还可以使用syscalls,printf是一个函数调用。此开销可能是由于包含了编译器的默认运行时库,因为您使用它来调用
printf()
。请注意,printf()
是一个比您调用的函数更强大的函数。所有这些功能当然意味着它包含更多的代码。您可以尝试将printf()
切换到put()
我并不是说单是printf()就有102 KB,可能还远远没有,但您还可以得到整个库,它是支持代码(init/de init、exit handlers等等),而不仅仅是一个函数。这个开销可能是由包含编译器的默认运行时库引起的,因为您正在使用它调用
printf()
。请注意,printf()
是一个比您调用的函数更强大的函数。所有这些功能当然意味着它包含更多的代码。您可以尝试将printf()
切换到put()
我并不是说单是
printf()
就有102KB,这可能远远不是那么回事,但您还可以得到整个库,它是支持代码(init/deinit、exit处理程序等等)而且不仅仅是一个函数。您没有指定正在使用的编译器和编译器选项。使用DLL不会影响可执行文件的大小。这就是为什么它被称为DLL(动态链接库)——一段没有静态链接到可执行文件的代码。就像我做的一个测试一样,gcc-Os-o hellosmall hellosmall.c&&strip hellosmall
(你问的是c代码),得到了一个4622字节的可执行文件(x86-64,cygwin)。您可以使用write
而不是printf
,您会注意到它会变得更小。不像汇编程序那么简单,但更接近。用C编写的程序包含C所需的所有运行时和启动代码。例如,它可能会启动stdin/stdout/stderr,包含程序退出时运行atexit()处理程序的机制,等等。根据编译器标志,可执行文件可能包含调试信息、链接到C运行时的指令、清除任何数据段的代码……您尚未指定正在使用的编译器和编译器选项。使用DLL不会影响可执行文件的大小。这就是为什么它被称为DLL(动态链接库)——一段没有静态链接到可执行文件的代码。就像我做的一个测试一样,gcc-Os-o hellosmall hellosmall.c&&strip hellosmall
(你问的是c代码),得到了一个4622字节的可执行文件(x86-64,cygwin)。您可以使用write
而不是printf
,您会注意到它会变得更小。不像汇编程序那么简单,但更接近。用C编写的程序包含C所需的所有运行时和启动代码。例如,它可能会启动stdin/stdout/stderr,包含程序退出时运行atexit()处理程序的机制,等等。根据编译器标志,可执行文件可能包含调试信息、链接到C运行时的指令、清除任何数据段的代码。。。