obj-c将struct指针传递给arm程序集函数 - corruption

时间:2016-10-24 01:37:06

标签: objective-c pointers assembly arm structure

我在obj-c中有一个结构。我将指向此结构的指针传递给我编写的arm汇编函数。当我进入代码时,我看到指针成功传入,我可以从我的asm代码中访问和修改结构元素的值。生活是美好的 - 直到我从asm函数返回。返回调用obj-c代码后,结构值全部被清除。我无法弄清楚为什么。以下是我的代码的相关部分。

struct myValues{    // define my structure
int ptr2A;  // pointer to first float
float A;        
float B;        
float C;
float D;  
float E;
float F;
}myValues;

struct myValues my_asm(int ptr2a, float A, float B, float C, float D, float E, float F);  //  Prototype for the ASM function

…code here to set values of A-F...

float* ptr2A = &myValues.A;    //get the memory address where A is stored
myValues.ptr2A = ptr2A;         //put that address into myValues.ptr2A and pass to the ASM function


// now call the ASM code
myValues = my_asm(myValues.ptr2A, myValues.A, myValues.B, myValues.C, myValues.D, myValues.E, myValues.F);

以下是我的asm代码的相关部分:

mov r5, r1      //   r1 has pointer to the first float A
vdiv.f32 s3, s0, s0  //this line puts 1.0 in s3 for ease in debugging
vstr s3, [r5]  // poke the 1.0 into the mem location of A
bx lr

当我单步执行代码时,一切都按预期工作,我最后在A的内存位置有一个1.0但是,一旦我执行了返回(bx lr)并返回调用obj-c代码中的值我的结构变成了垃圾。我已经通过ABI和AACPS进行了挖掘(尽管新手可能已经成功),但是无法解决这个问题。在那个“bx lr”之后发生了什么来破坏这个结构?

下面是我的asm代码的“Rev 1”。我删除了除这些行之外的所有内容:

_my_asm:  
vdiv.f32 s3, s0, s0   // s3 = 1.0
vstr s3, [r1]
bx lr

好的,这对我来说是解决方案。下面是我的obj-c代码的相关部分的“Rev 2”。我正在混淆传递指针与传递结构的副本 - 完全软管。这段代码只传递一个指向我结构中第一个浮点数的指针...我的asm代码从通用寄存器r0中获取。伙计,我很难过。 ; - )

void my_asm2(int myptr);    // this is my prototype.  

这是我从我的obj-c代码调用asm2代码的地方:

my_asm2(&myValues.A);  

我的asm2代码如下所示:

_my_asm2:                   ; @simple_asm_function
// r0 has pointer to the first float of my myValues structure
// Add prolog code here to play nice
vdiv.f32 s3, s0, s0   //result S3 = 1.0
vstr s3, [r0]         // poking a 1.0 back into the myValues.A value
// Add Epilog code here to play nice
bx lr

因此,总而言之,我现在可以将指向我的结构myValues的指针传递给我的ASM代码,并且在我的ASM代码中,我可以将新值推回到这些内存位置。当我回到我的调用obj-c代码时,一切都如预期的那样。感谢那些帮助我摸索这个爱好的人。 : - )

1 个答案:

答案 0 :(得分:0)

这里的解决方案是简单地将指针(指向结构中第一个浮点变量的内存位置)传递给汇编函数。然后,在返回到调用函数时,汇编函数对这些内存位置所做的任何更改都将保持不变。请注意,这适用于调用汇编代码并希望该代码在现有数据结构上运行的情况(在本例中为myValues)。