我在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代码时,一切都如预期的那样。感谢那些帮助我摸索这个爱好的人。 : - )
答案 0 :(得分:0)
这里的解决方案是简单地将指针(指向结构中第一个浮点变量的内存位置)传递给汇编函数。然后,在返回到调用函数时,汇编函数对这些内存位置所做的任何更改都将保持不变。请注意,这适用于调用汇编代码并希望该代码在现有数据结构上运行的情况(在本例中为myValues)。