我已经编写了一个在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
答案 0 :(得分:0)
您的任何一个函数都没有正确返回结构。您需要了解ARM ABI。您可以先阅读Apple的iOS ABI Function Call Guide。如果在研究了ABI后你不明白,请问一个新的问题,说明你曾经尝试过的。
HTH