如果使用 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
你到底想做什么?
- 在 ARM 计算机上编写程序(使用 x86 语法!)稍后 运行 在 x86 PC 上或在 x86 PC 上编写程序(使用 ARM 语法!)稍后 运行在 ARM 上 CPU?
- 编写应 运行 在 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 条指令。
如果我在非英特尔系统上assemble,我可以使用 GAS(GNU 汇编器)的英特尔语法吗?
本质上,我是
到目前为止,我对 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
你到底想做什么?
- 在 ARM 计算机上编写程序(使用 x86 语法!)稍后 运行 在 x86 PC 上或在 x86 PC 上编写程序(使用 ARM 语法!)稍后 运行在 ARM 上 CPU?
- 编写应 运行 在 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 条指令。