在Embarcadero Delphi XE5中,我该如何在Android上编写ARM汇编代码?可以在哪里进行编写?

4

我如何在Embarcadero Delphi XE5中为Android编写ARM汇编代码?最好能够内联编写。

4个回答

7

Delphi移动编译器不支持asm ... end块。

但是,由于我们正在谈论的是一个本地编译器,因此“旧的好方法”仍然可用。

您可以使用外部汇编器(例如GNU AS)编译自己的模块,然后将其链接到Delphi XE*应用程序中。

例如,System.RTTI通过外部静态链接文件使用低级别的asm技巧:

procedure RawInvoke(CodeAddress: Pointer; ParamBlock: PParamBlock);
  external 'librtlhelper.a' name 'rtti_raw_invoke';

procedure RawIntercept;
  external 'librtlhelper.a' name 'rtti_raw_intercept';

看一下这篇日文文章- 谷歌翻译是你的好朋友!(点击此处阅读)


你怎么知道这些外部对象是用汇编语言编写的。同样也可能是任何语言,并编译成本地代码。 - David Heffernan
对于x86和x64,RawInvoke()RawIntercept()直接在Rtti.pas中以汇编语言编写。对于ARM,Embarcadero保持使用汇编语言并根据需要进行调整,而不是将其翻译成更高级别的语言。为什么你认为RTL仍然在其核心例程中使用内联汇编,并从未启用它们的PUREPASCAL版本?它们在汇编语言中更有效率。 - Remy Lebeau
@Remy 这是一个不同的观点。我的观点是,它不清楚它是否是汇编语言。编写ARM汇编程序与x86截然不同。所以也许用C语言编写会更容易。 - David Heffernan
@DavidHeffernan 尝试使用纯C编写这样的启动代码。它将比汇编代码难以阅读,因为您需要单独处理每个寄存器。查看rtti.pas中嵌入的相应x86 / x64版本。我对自己所说的有一点了解,因为我为mORMot.pas编写了类似的低级代码-查看我的RawIntercept的自己的x86 / x64引导代码版本,您可能会发现我知道自己在说什么,特别是与RTTI.pas的编码方式相比。顺便说一句,OP的问题是关于编写ARM汇编代码的。 - Arnaud Bouchez
@DavidHeffernan 这不是任何例行程序,而是需要显式处理CPU寄存器的低级引导代码。在Pascal中不可能。在C中是一场噩梦。在汇编语言中很容易。我看不出为什么不能在这里使用汇编语言。 - Arnaud Bouchez
显示剩余2条评论

2

1
Delphi 移动编译器不支持内联汇编。文档 明确指出:
内联汇编仅适用于: DCC32.EXE,Delphi 命令行编译器 DCC64.EXE,Delphi 64 位命令行编译器 DCCOSX.EXE,Delphi OS X 跨平台编译器
您需要找到一个汇编器来创建 Delphi 移动编译器可以使用的内容,例如共享库。

1

你做不到。

LLVM是Delphi Mobile引擎的背后,它有一种汇编语言:http://llvm.org/docs/CommandGuide/llvm-as.html。但它几乎不可能是ARM或x86类型的,因为LLVM试图成为CPU无关的。

无论如何,Delphi官方都不支持CPU本地汇编语言或LLVM类型的汇编语言。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接