我是 ARM 汇编的新手,正在阅读关于 BL 指令的内容
BL 和 BLX 指令将下一条指令的地址复制到 lr(r14)。
下一条指令的地址存储在 r14 中,现在,我如何确保没有其他程序或例程应该使用该寄存器。
如何保护 r14 不被其他例程覆盖?
如果您在汇编中编程,那么您害怕的“其他程序或例程”是什么?
你在调用别人的代码吗?如果你是,那么标准的 ARM 调用约定应该适用,并且 LR 寄存器用于链接的事实是众所周知的。在您自己的代码中,只需确保您不要尝试将寄存器用于其他任何事情,或者如果您这样做,请先保存它。
如果您的函数要调用另一个函数(或使用 r14 作为 gpr),则在进入函数时(或至少在修改之前)将其压入堆栈,然后在返回之前的某个时间点将其恢复。
stmdb r13!,{lr}
...
bl somefunction
...
ldmia r13!,{pc}
如果您正在混合 C 和汇编或任何已编译的代码,那么您应该尝试符合 arm eabi,它现在希望堆栈 64 位对齐,因此推送另一个寄存器,不管您是否需要,这样您就有了偶数个寄存器被推送和弹出。