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

标签 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!");
}

c 程序使用 MinGW 编译,使用默认选项

最佳答案

此开销可能是由于包含编译器的默认运行时库造成的,因为您正在使用它来调用 printf()。请注意,printf() 是一个比 the DOS interrupt 功能更强大的函数。你在打电话所有这些功能当然意味着它包含更多代码。您可以尝试将 printf() 切换为 puts()

我并不是说单独的 printf() 是 102 KB,它可能远非如此,但您还可以获得整个库,它是支持代码(init/de-init,exit -handlers,等等)而不仅仅是那个函数。

关于c - 汇编语言和c语言——文件大小的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21826785/

相关文章:

c++ - preread中偏移量的时间复杂度?

c - 传递struct的字段名在函数内部访问

linux - 汇编:如何将数字转换为ascii并写入显示缓冲区

c - 如何在 x86 中编写 C "&&"运算符?

c++ - 节能自旋环

macos - macOS Mojave 上的 x86_64 程序集退出系统调用参数?

c - 如何在 pthread 中使用 C popen

c - 如何让一个线程等待其他线程完成

c - _builtin_prefetch()中第二个参数的作用是什么?

gcc - 从 64 位汇编调用 C 函数