2

我不确定这是转发还是什么,但我会问它:P

在 linux 中,我可以使用 GCC 编译 C 代码。我可以用 NASM 编译 asm 代码。但是,当我使用 nasm 创建输出文件时:nasm -f elf something.asm -o objfile这会创建一个目标文件(对吗?),但我显然无法运行。所以,我所做的是使用 gcc 和 nasm。我有 objfile 然后“链接?” 使用 gcc:gcc objfile -o 可执行文件

问题:那么使用 gcc 和其他使用 nasm 的程序制作简单的 C 有什么区别?可执行文件的大小:(它们具有完全相同的东西)

-rw-r--r-- 1 int3 int3  280 Out 11 19:22 asm.asm
-rwxr-xr-x 1 int3 int3 7330 Out 11 19:22 ASMprogram
-rw-r--r-- 1 int3 int3   50 Out 11 19:08 c.c
-rwxr-xr-x 1 int3 int3 7294 Out 11 19:14 Cprogram
-rw-r--r-- 1 int3 int3  608 Out 11 19:22 objasm

汇编如何比 C 程序有更多的字节?(它有外部 printf):(

我真的很想在不使用 gcc 和 C 库的情况下编写一些东西。我知道Linux的中断,特别的是int $0x80。我可以调用 sys_write。但它只写 1 个字符。我有点困惑。

你有什么推荐给我的?

感谢和快乐的编码!

4

1 回答 1

4

编译为汇编时,您是否尝试过:

gcc -S -m32 -O1 file.c 

-S 表示编译为程序集但不链接到可执行文件。m32 表示您的 32 位机器(即使您有 64 位也可以) -O1 表示您要将其优化到第一级。优化级别越高,阅读难度就越大。编译后你会有一个 .s 文件,它是你的汇编代码。

于 2013-10-11T18:52:06.683 回答