我不熟悉ARM程序集并阅读有关BL指令的内容
BL和BLX指令将下一条指令的地址复制到lr(r14)。
下一条指令的地址存储在r14中,现在,我如何确保没有其他程序或例程可以使用该寄存器。
如何保护r14不被其他一些例程覆盖?
答案 0 :(得分:2)
如果你是在汇编编程,这个“其他程序或例行程序”你害怕什么?
你在打电话给其他人的代码吗?如果是,则应该应用标准的ARM调用约定,并且LR寄存器用于链接的事实是众所周知的。在您自己的代码中,只需确保您不要尝试将寄存器用于其他任何内容,或者如果您这样做,请先保存。
答案 1 :(得分:1)
如果你的函数要调用另一个函数(或者使用r14作为gpr),那么在函数中输入时将其推入堆栈(或至少在修改之前),然后在返回之前的某个时刻将其恢复
stmdb r13!,{lr}
...
bl somefunction
...
ldmia r13!,{pc}
如果你正在混合C和汇编或任何已编译的代码,那么你应该尝试顺应arm eabi,它现在希望堆栈64位对齐,所以推送另一个寄存器,无论你是否需要,都没关系,所以你有一个偶数个寄存器被推送和弹出。