Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
汇编语言和c语言-文件大小的比较_C_Assembly - Fatal编程技术网

汇编语言和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程序——一个是在x86汇编中使用CMD中的调试器,另一个是在c语言中

由于汇编语言向CPU提供非常精确的指令,因此可执行文件在内存中所占的字节数少于可执行c文件也就不足为奇了。但令我惊讶的是,两者之间的差异实在太大了:下面是:

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运行时的指令、清除任何数据段的代码。。。