【发布时间】:2017-02-10 05:24:52
【问题描述】:
我编写了一个汇编函数,可以在 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 结构中?
谢谢, 中继器357
附言下面是我的 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
【问题讨论】:
-
编写等效的C代码,然后反汇编。那里的某个地方无法满足 ABI 的需求。
标签: ios objective-c iphone assembly arm