return des flotteurs à l'objective-c de la fonction d'assemblage des arm

J'ai écrit une fonction d'assemblage qui fonctionne bien sur un iPhone 4 (code 32 bits) ainsi que sur un iPhone 6s (code 64 bits). Je passe en quatre nombres à floating point d'une fonction appelante dans l'objective-c.

Voici la structure que j'utilise pour les 4 nombres à floating point et ci-dessous qui est le prototype de la fonction – comme trouvé en haut de mon code 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 

Dans mon code objective-c, j'appelle ma fonction d'assemblage comme ceci:

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

Lors de l'exécution contre l'iPhone 6S, le code fonctionne comme un champ (code 64 bits). Les 4 valeurs à floating point sont transmises du code objective-c au code d'assemblage via les registres à flotteur unique ARM S0-S4. Les résultats renvoyés sont également transmis via S0-S4.

Lors de l'exécution contre l'iPhone 4, le code fonctionne bien aussi (code 32 bits). Les 4 valeurs à floating point sont transmises du code obj-c au code d'assemblage via les registres à flotteur unique ARM S0, S2, S4 et S6 (pas sûr pourquoi saute les registres impairs). Le code fonctionne bien mais les valeurs qui sont renvoyées à ma structure obj-c sont garbage.

Où / comment puis-je passer des valeurs à floating point à partir du code ARM 32 bits pour qu'elles reviennent dans la structure obj-c?

merci, relayman357

ps Voici mon code d'assemblage de mon file 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 

    Aucune de vos fonctions ne renvoie correctement une structure. Vous devez comprendre l'ABI ARM. Vous pouvez commencer par lire le guide d'appel de la fonction iOS ABI d' Apple. Si après avoir étudié l'ABI vous ne comprenez pas, posez une nouvelle question en indiquant ce que vous avez essayé.

    HTH