gpt4 book ai didi

在 arm gcc 中控制函数的 prelog 和 epilog

转载 作者:太空宇宙 更新时间:2023-11-03 23:21:46 25 4
gpt4 key购买 nike

我注意到,有时当我编译 C 代码时,有时会在方法 1 中生成汇编代码:

STR R11, [SP, #-4]!
ADD R11, SP, #0
SUB SP, SP, #4

有时在方法 2 中:

STMFD SP!, {R11, LR}
ADD R11, SP, #4
SUB SP, SP, #4

第一种和第二种的区别在于第二种是将LR存入栈中。

现在我面临一个问题,我的函数像第一个方法一样开始,使用链接寄存器 (BL) 调用另一个函数,并且由于我的函数首先不保存 LR,它导致了一个严重的问题.如果我可以告诉编译器使用第二种方法它可以解决我的问题。

可能与该函数使用内联汇编调用内部函数有关,因此“不识别”存在对另一个函数的调用并且认为没有保存LR的意义。调用内联汇编是有义务的,因为被调用的函数获取 SP 的值作为参数。

这是一个 22 条军规的情况,希望有人能帮我解决这个问题。谢谢!

最佳答案

lr 标记为已损坏以使编译器保存它:

extern void foo(void);
extern void bar(void)
{
asm ( "bl foo" : : : "lr" );
}

生成以下代码:

bar:
str lr, [sp, #-4]!
bl foo
ldr lr, [sp], #4
bx lr

参见 the documentation更多细节。请记住也将您使用的所有其他寄存器标记为已损坏。否则编译器可能会在其中之一中放置一个变量。您可能还需要将所有调用者保存的寄存器标记为已损坏。

关于在 arm gcc 中控制函数的 prelog 和 epilog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37562932/

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