【问题标题】:How to use gcc to compile a NASM-syntax .asm file?如何使用 gcc 编译 NASM 语法 .asm 文件?
【发布时间】:2017-10-13 02:24:29
【问题描述】:

我有一些.asm 文件使用英特尔汇编格式。

有没有办法用 GCC/G++ 编译这些文件?

我知道 NASM 和 YASM 可以选择编译 .asm 文件,但是 GCC/G++ 可以自己完成吗?使用 NASM,我使用 -fwin64 标志来制作 64 位目标文件。

我使用的是 Windows 64 位。

【问题讨论】:

  • gcc -c myfile.s -o myfile.o
  • 不,我的意思是如何运行 gcc -c *.asm?
  • 您能否通过编辑您的问题并添加它来向我们展示您尝试组装的代码。我问这个是因为为 asm 文件编写的汇编程序真的很重要。 GCC 通常通过将 .s.S 汇编文件传递给 GNU 汇编器来处理它们。 GNU 汇编器的语法与 NASM 汇编器之类的不同。如果您提供了汇编代码,我们可以确定您真正想要做什么。
  • 如果你有一个 NASM 汇编文件,那么你可以用 nasm -f elf32 myfile.asm -o myfile.o 之类的东西来组装它,然后你可以使用 GCC 将它链接到一个带有 @987654327 之类的可执行文件@ .如果 64 位代码将 32 替换为 64。 GCC 无法组装用于 NASM 的文件。
  • 好的,据我了解,gcc 不能直接编译.asm 文件,.asm 应该由nasm 那样编译,对吧?我的意思是,如果 gcc 可以识别 .asm 格式并将其构建在一起?

标签: assembly gcc x86 nasm


【解决方案1】:

要编译 .asm 文件以使用 GCC 运行,您必须:

  • 确保您的"_start" 标签为main
  • 使用nasm -f elf file.asm 创建.asm 文件的对象
  • 使用gcc -m32 -o file file.o* 创建的链接对象文件
  • 使用./file 运行

    *基于 32 位的程序的链接,基于 64 位的链接我认为只有 gcc -o file file.o 可以。
  • 【讨论】:

    • 完全不使用nasm可以做到这一点吗?
    • @bluejayke:如果您的源文件是用 NASM 语法编写的,则不会。 NASM 和 YASM 是仅有的两个能够理解 NASM 指令、宏和语法规则(就像裸标签是立即数而不是内存操作数)的汇编程序。 GCC / GAS 无法组装 NASM 语法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 2011-11-03
    • 2017-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多