【问题标题】:Assembly compiler on linux. Nasm or AS?linux上的汇编编译器。 Nasm 还是 AS?
【发布时间】:2013-10-19 22:24:09
【问题描述】:

我不确定这是转发还是什么,但我会问它: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 个字符。我有点迷茫。

你有什么推荐给我的?

感谢并祝您编码愉快!

【问题讨论】:

  • 另一种选择是 clang 和 llvm 程序集。

标签: c linux gcc nasm ld


【解决方案1】:

编译到汇编时你试过吗:

gcc -S -m32 -O1 file.c 

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

【讨论】:

  • ` -rw-r--r-- 1 int3 int3 640 Out 11 20:01 ex1 -rwxr-xr-x 1 int3 int3 360 Out 11 20:02 ex1.bin -rw-r --r-- 1 int3 int3 207 Out 11 19:59 pureasm.s`刚刚使用中断。意思是系统调用。用nasm编译并与ld链接。 :) 但我需要查阅系统调用表才能使用 xD
  • 哦等等。你确定是“gcc c.c -S m32 -O1”吗? " gcc: error: m32: No such file or directory" 我在这里遗漏了一些东西
  • 我刚改了。我忘了在 m 之前加上连字符。
猜你喜欢
  • 2011-02-21
  • 1970-01-01
  • 2017-01-26
  • 2013-02-06
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-26
相关资源
最近更新 更多