Я написал функцию сборки, которая отлично работает на iPhone 4 (32-разрядный код), а также на iPhone 6s (64-разрядный код). Я передаю четыре числа с плавающей запятой из вызывающей функции в объективе-с.return floats to object-c от функции сборки руки
Вот структура, которую я использую для 4 чисел с плавающей запятой и ниже, которая является прототипом функции - как она находится в верхней части моего объектного кода 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 значения с плавающей запятой передаются из кода object-c в код сборки через однопоточные регистры ARM S0-S4. Полученные результаты также передаются через S0-S4.
При работе с iPhone 4 код работает отлично (32-разрядный код). 4 значения с плавающей запятой передаются из кода obj-c в код сборки через однопоточные регистры ARM S0, S2, S4 и S6 (не знаю, почему пропускает нечетные регистры). Код работает нормально, но значения, возвращаемые в мою структуру obj-c, - это мусор.
Где/как передавать значения с плавающей запятой из 32-битного кода ARM, чтобы они возвращались в структуру 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
Напишите эквивалентный код C, а затем разоберите его. Где-то там вы не отвечаете потребностям ABI. – bbum