从arm汇编函数返回float到objective-c

我写了一个汇编函数,可以在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从目标代码传递到汇编代码。 返回的结果也通过S0-S4传递。

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

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

谢谢,relayman357

ps下面是我的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 

你的两个函数都没有正确地返回一个结构。 您需要了解ARM ABI。 您可以从阅读Apple的“ ABI函数调用指南”开始 。 如果在研究ABI之后,你不明白问一个新的问题,显示你已经尝试过了。

HTH