微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如果使用Intel语法,GAS可以在非Intel系统上组装吗?

如果我在非Intel系统上进行汇编,是否可以在GAS(GNU汇编程序)中使用Intel语法?

从本质上来说,我starting out从事汇编程序设计,尽管我在高级语言方面有多年的经验,但我想选择一种适用于x86和ARM的汇编程序。可能还有其他体系结构,但这不是当前迫切的需求。

到目前为止,我对NASM感到满意,但我也需要ARM,因此GAS似乎是不错的候选人。没有写任何复杂的东西,但我同样愿意接受AT&T以及英特尔的语法。

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

我意识到,指令集自然会有所不同,但我只想选择一种工具来涵盖两种体系结构-我的想法是,如果我需要第三个工具,那么学习和维护的工具将会更少。从第一天开始,我就在GAS中做所有事情。

直觉上,我想说,使用GAS可能会构建AST,然后发出特定于体系结构的代码,而不管前端如何,因此使用Intel语法而不是AT&T在ARM或其他非Intel体系结构上汇编程序应该没有任何障碍。语法,但不幸的是,我无法使用ARM系统进行尝试,尽管如此,我还是非常想与知识渊博的人一起确认它。谢谢。

编辑:我想出了一个比喻,也许可以使我更清楚地了解自己的想法。假设有人学会了在Linux上有效地使用vim来使用Python,那么所有这些知识都可以轻松地转移到Mac上,以便使用Objective-C进行开发。

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

如果某天需要在Windows上开发Java,那么该Java仍然适用,程序员将能够在第三个系统上使用vim或衍生产品。

最终,Python,Obj-C和Java之类的语言之间的实际差异自然会使任何与工具相关的问题相形见but,但是当刚开始工作时,使用相同工具满足多种不同需求的想法就相当多了吸引人的。

这是我正在考虑的可重用性。

解决方法

您的一些直觉是正确的。 Gas确实支持multiple architectures,并且具有assembler directives之类的核心功能,使您能够在Gas的体系结构端口之间传递一些工作知识。某些命令行概念将被共享;其他人将因架构端口维护人员当时的想法而有所不同。

问题的其他方面,尤其是AT&T语法与Intel语法的问题,对于您所提出的问题而言,位置并不理想。我更喜欢将它们视为x86的方言,挑战在于学习指令集。您对变更架构的要求更为根本;您每次都将学习一种新的“语言”,例如.balign之类的Gas指令就像这些语言之间唯一的通用标点符号一样。

Gas确实需要为要定位的每种体系结构构建一个单独的版本。在任何单独的系统上,您都可能像要为当前计算机编写汇编程序那样“本机”运行。这不是使用Gas的唯一方法,因此,如果您没有Arm机器,“试用”它的一种方法是安装交叉汇编程序(例如,在Ubuntu https://packages.ubuntu.com/focal/binutils-arm-linux-gnueabi上)。 / p>

,

我想选择适合x86和ARM的汇编器

您到底想做什么?

  1. 在稍后要在x86 PC上运行的ARM计算机上编写程序(以x86语法!)或在后来要在ARM CPU上运行的x86 PC上编写程序(以ARM语法!)?
  2. 编写可同时在ARM和x86 PC上运行的汇编程序吗?

如果答案为1。:

较小设备(例如WLAN路由器或Smartpones)中的许多CPU是ARM CPU。但是,您希望在具有x86 CPU的PC上为此类设备开发程序。

您要做的是将GAS版本与“目标” ARM和“主机” x86一起使用。这意味着GAS在x86 CPU上运行,但为ARM CPU生成代码。

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

据我所知,GAS仅支持ARM CPU的一种语法变体。就像ARM的“ AT&T”语法一样。

如果您有一台ARM计算机,并且要在其上编写x86程序,则当然可以将GAS版本与“目标” x86和“主机” ARM一起使用。如果“目标”是x86,则GAS独立于“主机”支持“ AT&T”和“英特尔”语法。

如果答案为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,lsr #6在x86上需要2条指令。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。