Assembly 如何使用Clang以ARM语法编译ARM程序集?

Assembly 如何使用Clang以ARM语法编译ARM程序集?,assembly,syntax,arm,clang,armasm,Assembly,Syntax,Arm,Clang,Armasm,似乎默认情况下,Clang采用GNU汇编程序语法 如何使用ARM语法编译汇编文件?汇编语言是由汇编程序定义的,该程序解析文件并从中生成机器代码。我们都知道,用于x86的turbo汇编程序、microsoft汇编程序、nasm和gnu汇编程序不符合同一种语言。没有理由假设任何其他汇编程序符合任何其他人的汇编语言。你不应该在一个问题中使用这样的链接,看看如何提问,但是如果你想使用ARM语法,你必须使用一个ARM汇编程序,这可能会很昂贵。如果您想要gnu语法,您可以使用gnu和其他语法,您可以使用其他

似乎默认情况下,Clang采用GNU汇编程序语法


如何使用ARM语法编译汇编文件?

汇编语言是由汇编程序定义的,该程序解析文件并从中生成机器代码。我们都知道,用于x86的turbo汇编程序、microsoft汇编程序、nasm和gnu汇编程序不符合同一种语言。没有理由假设任何其他汇编程序符合任何其他人的汇编语言。你不应该在一个问题中使用这样的链接,看看如何提问,但是如果你想使用ARM语法,你必须使用一个ARM汇编程序,这可能会很昂贵。如果您想要gnu语法,您可以使用gnu和其他语法,您可以使用其他语法。同样地,C编译器的作者应该或者经常希望将输入符合C标准,而C标准不是由编译器定义的,而是由标准机构定义的。该编译器的输出不必符合除该编译器创建的标准之外的任何标准,他们可以选择某种对象格式的机器代码,也可以像他们通常所做的那样,选择某种汇编语言,采用任何汇编程序想要的格式。没有理由期望它们支持多个汇编程序。很明显,你把工具组合成一个链,一个编译器链到一个汇编器,这些输出链到链接器。如果一个特定的llvm工具选择或只支持一个汇编程序定义的一种汇编语言,那么就没有理由期望它们支持其他汇编语言。如果他们很好地支持其他人,也许您可以使用正确的命令行选项。llvm工具和gnu一样都是开源的,欢迎您随时根据需要更改任何内容。

您可能无法更改指令。如果您想要armasm指令,您需要使用ARM的armasm。@RossRidge,这里他们说了如何在Clang中为x86选择语法:。手臂不是有类似的东西吗?或者,如果你的意思是重构汇编文件以将指令从ARM更改为GNU语法-不,我不想这样做。这只会更改指令语法,而不会更改使用的指令。如果你想使用你在文章中链接的armasm指令,你可能需要使用一个不同的汇编程序,一个支持这些指令的汇编程序,比如
armasm
本身。它可能已经是了。除了ARM之外,我不知道其他语法。然而,它有两种变体,旧的ARM语法和新的统一语法(UAL)。我相信clang只支持后者。如果您想要旧的形式,您可能还必须使用不同的汇编器。有旧的和统一的指令,但是每个指令的确切细节在arms汇编器和gnu之间是并且一直是不可移植的(gnu汇编器总是设法破坏某些东西,使其在特定注释中不可移植)。许多指令和事情,比如mrs/msr指令格式是如何被arm工具或gnu工具或两者都敏感的。你真的必须以一种汇编语言为目标。简短回答如果你不想使用llvm所针对的汇编程序,那么要么使用目标汇编程序,要么修改llvm以针对你的汇编程序,要么编写一个工具来移植输出,要么不使用该编译器。Llvm现在可以从llc而不是汇编器生成对象,所以如果这有帮助的话,您可以避免组装步骤。