gpt4 book ai didi

c++ - 从 arm 程序集调用 c 函数时堆的地址发生了变化?

转载 作者:太空宇宙 更新时间:2023-11-04 11:56:51 24 4
gpt4 key购买 nike

这是我的代码:

test.cpp

class Message
{
public:
long long msgid;
char* msgStr;
};

int foo(Message* msg)
{
// TODO
// print: msg->msgid, msg->msgStr
}

int main()
{
char buf[20] = "Hello";
Message msg = new Message;
msg->msgid = 0x10;
msg->msgStr = buf;

foo(msg);

call_from_arm((void*)&foo, (void*)msg);

foo(msg);

return 0;
}


test.S

call_from_arm:
@r0 = ptrFunc
@r1 = obj
STMFD r13!, {r4-r11,r14}

MOV r8, r0 @r8 = ptrFunc
MOV r0, r1 @r0 = r1
BLX r8 @call ptrFunc

LDMFD r13!, {r4-r11,pc}

应用程序运行时,发现call_from_arm传给foo的参数是正确的(msg的地址),但是Message实例包含了错误的值,好像堆上的内容发生了偏移。

此应用程序的输出如下所示:

msgid : 10, msgStr : Hello
msgid : (wrong value), msgStr : (wrong value, app may crash here)
msgid : 10, msgStr : Hello

这个问题困扰了我几天。请帮我。谢谢

如果我将类 Message 更改为

class Message
{
char* msgStr;
}

我可以打印字符串“Hello”的正确值,所以我认为问题可能出在字节对齐上。 long long 是重点。但我仍然不知道为什么。


I have solved this problem. AAPCS requires 8 bytes-align. 
My old version code store r4-r11 & lr into stack, whitch is not 8 bytes-aligned.

最佳答案

请如下更改您的call_from_arm

 call_from_arm:
@r0 = ptrFunc
@r1 = obj

MOV r2, r0 @r2 = ptrFunc
MOV r0, r1 @r0 = r1
BX r2 @call ptrFunc

我怀疑您以某种方式弄乱了堆栈。函数 int foo(Message* msg) 应该保存所有非 volatile 寄存器。因此,如果我们不使用它们,则无需保存 r4-r11。此外,lr 已经为返回设置,因此您可以使用 tail 函数 优化,只需跳转ptrFunc直接。

另请注意,您可以使用 function pointers 改进 call_from_armC++ 接口(interface).

 extern int call_from_arm(int (*ptrFunc)(Message* msg), Message* msg);
/* ... */
call_from_arm(foo, msg); /* no casting is better! */

正如其他人所说,更多信息将有助于诊断问题。根据目前的信息,我们只能猜测,就像我所做的那样。

关于c++ - 从 arm 程序集调用 c 函数时堆的地址发生了变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15875747/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com