返回从arm组装函数

时间:2016-10-01 21:44:27

标签: ios objective-c iphone assembly arm

我已经编写了一个在iPhone 4(32位代码)以及iPhone 6s(64位代码)上运行良好的汇编函数。我从objective-c中的调用函数传入四个浮点数。

这是我用于4个浮点数的结构,下面是函数的原型 - 可以在我的objective-c代码的顶部找到。

struct myValues{    // This is a structure.  It is used to conveniently group multiple data items logically.
    float A;        // I am using it here because i want to return multiple float values from my ASM code
    float B;        // They get passed in via S0, S1, S2 etc. and they come back out that way too
    float number;
    float divisor;  //gonna be 2.0
}myValues;

struct myValues my_asm(float e, float f, float g, float h);  //  Prototype for the ASM function

在我的objective-c代码中,我调用我的汇编函数:

myValues = my_asm(myValues.A, myValues.B, myValues.number,myValues.divisor);   // ASM function

当针对iPhone 6S运行时,代码就像冠军(64位代码)一样运行。 4个浮点值通过ARM单浮点寄存器S0-S4从objective-c代码传递到汇编代码。返回的结果也通过S0-S4传递。

在iPhone 4上运行时,代码运行正常(32位代码)。 4个浮点值通过ARM单浮点寄存器S0,S2,S4和S6从obj-c代码传递到汇编代码(不确定为什么跳过奇数寄存器)。代码运行正常,但返回到我的obj-c结构的值是垃圾。

我在哪里/如何从ARM 32位代码传递浮点值,以便它们返回到obj-c结构中?

感谢, relayman357

P.S。下面是我的Xcode S文件中的汇编代码。

.ios_version_min 9, 0
.globl  _my_asm
.align  2

#ifdef __arm__
.thumb_func _my_asm
.syntax unified
.code 16

_my_asm:                   // 32 bit code
// S0 = A, S2 = B, S4 = Number, S6 = 2.0   - parameters passed in when called by the function
vadd.f32 s0, s0, s2 
vdiv.f32 s0, s0, s6   
vdiv.f32 s1, s4, s0   
vcvt.u32.f32 r0,s0
bx lr
//ret

#else
_my_asm:                  // 64 bit code
//add W0, W0, W1
; S0 = A, S1 = B, S2 = Number, S3 = 2.0  parameters passed in when called by the function
fadd s0, s0, s1  
fdiv s0, s0, s3  
fdiv s1, s2, s0  
ret

#endif

1 个答案:

答案 0 :(得分:0)

您的任何一个函数都没有正确返回结构。您需要了解ARM ABI。您可以先阅读Apple的iOS ABI Function Call Guide。如果在研究了ABI后你不明白,请问一个新的问题,说明你曾经尝试过的。

HTH