0

我是 ARM 汇编的新手,正在阅读关于 BL 指令的内容

BL 和 BLX 指令将下一条指令的地址复制到 lr(r14)。

下一条指令的地址存储在 r14 中,现在,我如何确保没有其他程序或例程应该使用该寄存器。

如何保护 r14 不被其他例程覆盖?

4

2 回答 2

2

如果您在汇编中编程,那么您害怕的“其他程序或例程”是什么?

你在调用别人的代码吗?如果你是,那么标准的 ARM 调用约定应该适用,并且 LR 寄存器用于链接的事实是众所周知的。在您自己的代码中,只需确保您不要尝试将寄存器用于其他任何事情,或者如果您这样做,请先保存它。

于 2013-10-28T12:15:52.830 回答
1

如果您的函数要调用另一个函数(或使用 r14 作为 gpr),则在进入函数时(或至少在修改之前)将其压入堆栈,然后在返回之前的某个时间点将其恢复。

stmdb r13!,{lr}
...
bl somefunction
...
ldmia r13!,{pc}

如果您正在混合 C 和汇编或任何已编译的代码,那么您应该尝试符合 arm eabi,它现在希望堆栈 64 位对齐,因此推送另一个寄存器,不管您是否需要,这样您就有了偶数个寄存器被推送和弹出。

于 2013-10-28T13:46:00.163 回答