【发布时间】:2023-03-06 22:48:02
【问题描述】:
如果我在非英特尔系统上进行汇编,我可以将英特尔语法与 GAS (GNU Assembler) 一起使用吗?
本质上,我是starting out 从事汇编编程,虽然我在高级语言方面有多年经验,但我想选择一个适用于 x86 和 ARM 的汇编程序。可能还有其他架构,但目前这不是迫切需要。
到目前为止,我对 NASM 很满意,但我还需要 ARM,所以 GAS 似乎是一个不错的候选者。没有写过任何复杂的东西,但我对 AT&T 和 Intel 语法同样持开放态度。
如果我选择 Intel 语法,我唯一不确定是否可以使用 GAS 进行跨架构编程?
我意识到指令集自然会有所不同,但我只想选择一种工具来涵盖这两种架构 - 我的想法是,如果随着时间的推移我需要第三个工具,那么学习和维护的工具将会减少我从第一天开始就在 GAS 中做所有事情。
直观地说,我会说使用 Intel 语法而不是 AT&T 在 ARM 或其他非 Intel 架构上组装程序应该没有任何障碍,因为 GAS 可能会构建 AST,然后发出特定于架构的代码,而不管前端的语法,但不幸的是,我无法访问 ARM 系统来试用它,尽管如此,我还是非常想与更多知识渊博的人确认它。谢谢。
编辑:我想出了一个类比,也许可以更清楚地说明我的想法。假设有人学会了在 Linux 上有效地使用 vim 来使用 Python,那么所有这些知识都会很容易地转移到 Mac 上,以便使用 Objective-C 进行开发。
不用说,Python 和 Objective-C 是两种截然不同的语言,但工具知识(本例中为 vim)仍然很有用。
如果有一天这个人需要在 Windows 上开发 Java,同样的情况仍然成立,程序员将能够在第三个系统上使用 vim 或衍生产品。
最终,语言之间的实际差异,Python、Obj-C 和 Java,自然会使任何与工具相关的问题相形见绌,但是当某人刚刚开始时,使用同一个工具来满足多种不同需求的想法是相当不错的很吸引人。
这就是我正在考虑的那种可重用性。
【问题讨论】:
-
请注意,每个架构都有自己的指令集和语法。 ARM 上没有“Intel 语法”或“AT&T 语法”之类的东西。如果您编写汇编代码,则必须为 x86 和 ARM 编写完全不同的代码,无论您使用什么汇编程序。
-
Arm 组装没有 Intel 或 AT&T 语法的概念。出于向后兼容性的原因,GAS 不使用 x86 汇编的标准表示法;对于 Arm 没有类似的东西,GAS 使用 Arm 手册规定的语法
-
是的,GAS 可用于 ARM 组装。事实上,除了 Keil 和 Go 附带的汇编器之外,它几乎是唯一常用的 ARM 汇编器。但请注意,ARM 汇编语法与 Intel 和 AT&T 语法完全不同。
-
binutils 能够支持多种架构,但是一次一个,当您编译一组二进制工具时,您选择了目标。另一方面,llvm 是或可以是为许多体系结构构建一组二进制文件的另一种方式,但它们没有目标特定的汇编语言,它们有一个用于字节码的汇编语言,现在可以从字节码生成对象。不确定我是否知道另一个是跨架构、构建时间或运行时。从汇编器的角度来看并没有太大的价值,因为从一个到另一个的交叉很少,不足以值得。
-
@AtticusStonestrom 非常有道理!在某种程度上(我在这里半开玩笑)如果我的问题从字面上理解,真正的答案是否定的,如果使用英特尔语法,GAS 无法在非英特尔系统上组装:-)其背后的原因不是 GAS 本身的任何限制。
标签: assembly x86 arm gnu-assembler