ARM64在iOS上使用gas?

时间:2015-01-23 12:22:48

标签: android ios assembly gas arm64

我已经获得了一些移植到64位ARM的汇编功能,并且它们在Android上运行良好,但是当我尝试在Xcode中编译相同的文件时,我发现clang使用了不同的语法(与官方ARM文档不同)。

我发现了一些将源文件从一种格式转换为另一种格式的脚本,但这不是理想的解决方案(当源文件包含预处理器定义时,这些脚本似乎不起作用)

我可以在Xcode中简单地使用气体,还是配置clang来接受气体语法?如果没有,clang汇编程序文档在哪里?

更新 - 2015年9月

似乎问题是由XCode 7(新的clang版本?)解决的:现在我可以导入为Android编写的汇编源文件,并且编译时没有任何变化。

2 个答案:

答案 0 :(得分:3)

让我的答案作为在Android和iOS上编写ARM64代码的一般指南。首先,我们将从易失性和非易失性寄存器开始:

X0-X7 - 参数和返回值(易失性)
X8 =间接结果(struct)位置(或temp reg)
X9-X15 =临时(不稳定)
X16-X17 - 介绍呼叫使用寄存器(PLT,Linker)或临时
X18 - 平台特定用途(TLS)
X19-X28 - 被叫方保存的寄存器(非易失性)
X29 - 帧指针
X30 - 链接寄存器(LR)
SP - 堆栈指针和零(XZR)
V0-V7,V16-V31 - 易失性NEON和FP寄存器
V8-V15 - 被调用者保存的寄存器(非易失性,用于编译器的临时变量)

接下来是汇编程序指令,用于正确创建"段"为您的代码:

<强>的Android
  .cpu generic + fp + simd
  的.text
为每个功能添加这3行
  .section .text.MyFunctionName,&#34; ax&#34;,%progbits
  .align 2
  .type MyFunctionName,%function

iOS (除了align指令外,什么都不需要)
  .align 2

声明公共(全球)标签

<强>的Android
 .global MyFunctionName

<强>的iOS
  .globl _MyFunctionName &lt; - 注意全局指令的前导下划线和不同拼写

下一个区别在于获取指向源代码中定义的静态数据的指针。例如,假设你有一个数据表,你想用指向表的指针加载寄存器X0。

<强>的Android

  adrp  x0, MyDataTable
  add   x0, x0, #:lo12:MyDataTable

<强>的iOS

  adrp  x0,MyDataTable@PAGE
  add   x0,x0,MyDataTable@PAGEOFF

接下来,NEON语法。 iOS允许将大小信息附加到指令助记符,而Android想要查看大小为后缀的寄存器

<强>的Android
      ld1 {v0.16b},[x0],#16

<强>的iOS
      ld1.16b {v0},[x0],#16

嵌套循环
在32位ARM代码中,通常在堆栈上推送LR以在需要从函数内调用函数时保留它。由于NEON指令不再在协处理器中并且已经合并到Aarch64的主指令集中,因此来回移动数据不会受到惩罚。现在将X30(LR)保存在未使用的NEON寄存器中是切实可行的。例如:

  fmov d0,x30   // preserve LR
  <some code which makes function calls>
  fmov x30,d0   // restore LR

现在一切都是这样。如果有人发现存在更多差异的特定情况,我会添加它们。

答案 1 :(得分:0)

你很幸运。 Libav团队支持一种接受气体语法的工具,并为Apple的汇编程序输出汇编程序。您可以在此处找到该工具:https://github.com/libav/gas-preprocessor/blob/master/gas-preprocessor.pl