如果使用 Intel 语法,GAS assemble 可以在非 Intel 系统上使用吗?

Can GAS assemble on non-Intel systems if Intel syntax is used?

如果我在非英特尔系统上assemble,我可以使用 GAS(GNU 汇编器)的英特尔语法吗?

本质上,我是汇编编程,虽然我有多年的高级语言经验,我想选择一个适用于x86和ARM的assembler .可能还有其他架构,但这不是目前的迫切需求。

到目前为止,我对 NASM 很满意,但我还需要 ARM,因此 GAS 似乎是一个不错的选择。没有写过任何复杂的东西,但我对 AT&T 和 Intel 语法同样持开放态度。

唯一不确定的是,如果我选择 Intel 语法,是否也可以使用 GAS 进行跨架构编程?

我意识到指令集自然会有所不同,但我只想选择一种工具来涵盖这两种架构——我的想法是,如果随着时间的推移我需要第三种,那么学习和使用的工具就会更少如果我从第一天起就在 GAS 中做所有事情,请保持。

直觉上,我会说在 ARM 或其他非英特尔架构上使用 Intel 语法而不是 AT&T 到 assemble 程序应该没有任何障碍,因为 GAS 可能会构建 AST 然后发出架构-具体的代码,不管前端的语法如何,但不幸的是我无法访问 ARM 系统来尝试它,尽管如此,我非常想与更多知识渊博的人确认。谢谢。

编辑:我想出了一个类比,也许可以使我的想法更清楚。假设某人在 Linux 上学会了有效地使用 vim 来与 Python 一起工作,所有这些知识将很容易地转移到 Mac 以在 Objective-C 上进行开发。

不用说,Python 和 Objective-C 是两种截然不同的语言,但工具知识(vim,在本例中)仍然很有用。

如果有一天这个人需要在 Windows 上开发 Java,同样的情况仍然存在,程序员将能够在第三个系统上使用 vim 或衍生产品.

最终,语言之间的实际差异,Python vs. Obj-C vs. Java 自然会使任何与工具相关的问题相形见绌,但是当有人刚刚开始时,这个想法使用相同的工具来满足多种不同的需求是非常有吸引力的。

这就是我想到的那种可重用性。

您的某些直觉是正确的。 Gas 当然支持 multiple architectures, and there are core features like assembler directives,这将使您能够在 Gas 的架构端口之间转移一些工作知识。某些命令行概念将被共享;其他人会因架构端口维护者当时的想法而有所不同。

您问题的其他方面,尤其是 AT&T 语法与 Intel 语法的问题,不适合您提出的问题。我更愿意将这些视为 x86 的方言,挑战在于学习指令集。您关于更改架构的要求更为基本;你每次都将学习一种新的“语言”,像 .balign 这样的 Gas 指令就像这些语言之间唯一常见的标点符号。

Gas 确实需要为您要定位的每个架构构建一个单独的版本。在任何单独的系统上,您可能正在“本地”操作,就像您想为当前机器编写汇编程序一样。这不是使用 Gas 的唯一方法,所以如果您手边没有 Arm 机器,“试用”它的一种方法是安装 cross-assembler(例如,在 Ubuntu https://packages.ubuntu.com/focal/binutils-arm-linux-gnueabi).

I would like to choose an assembler that is suitable for both x86 and ARM

你到底想做什么?

  1. 在 ARM 计算机上编写程序(使用 x86 语法!)稍后 运行 在 x86 PC 上或在 x86 PC 上编写程序(使用 ARM 语法!)稍后 运行在 ARM 上 CPU?
  2. 编写应 运行 在 ARM 和 x86 PC 上的汇编程序?

如果答案是1.:

小型设备(例如 WLAN 路由器或智能手机)中的许多 CPU 都是 ARM CPU。但是,您想在具有 x86 CPU.

的 PC 上为此类设备开发程序

您所做的是使用具有“目标”ARM 和“主机”x86 的 GAS 版本。这意味着 GAS 在 x86 CPU 上 运行ning 但为 ARM CPU.

生成代码

但是,您的“源代码”(汇编程序)必须是 ARM 汇编程序。

据我所知,GAS 仅支持 ARM CPUs 的一种语法变体; ARM 的“AT&T”语法完全不同。

如果您有一台 ARM 计算机并且想在上面编写 x86 程序,您当然可以使用“目标”x86 和“主机”ARM 的 GAS 版本。如果“目标”是 x86,GAS 独立于“主机”支持“AT&T”和“Intel”语法。

如果答案是2.:

这行不通!

在汇编语言中,一条汇编指令通常代表CPU中的一条指令。并且不同的 CPU 架构具有完全不同的指令,因此汇编代码也完全不同。

这里是 x86 和 ARM 的示例程序:

Intel CPU, Intel syntax         ARM (non-Thumb) CPU
-----------------------         -------------------
mov eax, 4
mov ebx, 1                      ldr r0, =1
mov ecx, offset myText          ldr r1, =myText
mov edx, 6                      ldr r2, =6
int 0x80                        svc #0x900004

shr edi, 6
add eax, edi                    add r0, r0, r6, lsr #6

                                ldr r5, =someVariable
add [someVariable], eax         ldr r7, [r5]
                                add r7, r0
                                str r7, [r5]

可以看到指令没有1:1关系:

x86上的指令add [someVariable], eax在ARM上需要4条指令; ARM 上的指令 add r0, r0, r6, lsr #6 在 x86 上需要 2 条指令。