在ARM编程中,需要使用链接寄存器LR来保存返回子程序的地址。在非叶子子程序中,也需要保存调用该子程序之前的LR值,以便返回到上一层调用者。以下是一个示例代码,演示了如何在非叶子子程序中正确使用链接寄存器LR:
/* 定义一个函数,在非叶子子程序中使用LR */
void my_function(int arg1, int arg2) {
int saved_lr;
asm volatile ("mov %0, lr\n" : "=r" (saved_lr));
/* 在这里添加你的代码 */
asm volatile ("mov lr, %0\n" : : "r" (saved_lr));
}
在上面的示例代码中,我们首先使用汇编指令将LR的值保存到一个局部变量saved_lr中。然后在函数代码中添加其他操作。最后,我们使用汇编指令将保存的LR值存储回LR寄存器,以便能够正确返回到上一层调用者。请注意,这个过程需要使用volatile关键字来确保编译器不会尝试对汇编指令进行优化。