Assembly 如何保护ARM中的r14寄存器

Assembly 如何保护ARM中的r14寄存器,assembly,arm,Assembly,Arm,我是新的手臂组装和阅读有关BL的指示,其中说 BL和BLX指令将下一条指令的地址复制到lr(r14)中 下一条指令的地址存储在r14中,现在,我如何确保没有其他程序或例程使用该寄存器 我如何保护r14不被其他程序覆盖???如果你在汇编中编程,你害怕的“其他程序或程序”是什么 你在打别人的电话吗?如果是,那么标准的ARM调用约定应该适用,并且LR寄存器用于链接的事实是众所周知的。在您自己的代码中,只需确保您没有尝试将寄存器用于任何其他用途,或者如果您这样做,请先保存它。如果您在汇编中编程,那么您害

我是新的手臂组装和阅读有关BL的指示,其中说

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

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


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

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


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

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


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

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


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

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


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

如果您的函数要调用另一个函数(或使用r14作为gpr),则在函数中输入时(或至少在您修改它之前)将其推到堆栈上,然后在返回之前的某个时间将其还原

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

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

如果您的函数要调用另一个函数(或将r14用作gpr),然后在函数中输入时(或至少在修改之前)将其推送到堆栈上,然后在返回之前的某个时间点还原它

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

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

如果您的函数要调用另一个函数(或将r14用作gpr),然后在函数中输入时(或至少在修改之前)将其推送到堆栈上,然后在返回之前的某个时间点还原它

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

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

如果您的函数要调用另一个函数(或将r14用作gpr),然后在函数中输入时(或至少在修改之前)将其推送到堆栈上,然后在返回之前的某个时间点还原它

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

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

谢谢@unwind。我只是在virtula多核环境中思考多核同时出现的nt。r14有可能被覆盖。当然,其他核也有自己的执行状态(否则,你怎么能可靠地编程呢?)如果你正在编写一个线程程序,你通常必须关注全局可见内存的状态,而不是只在本地使用的寄存器或内存。谢谢@unwind。我只是想在virtula多核环境中,多核同时出现。r14有可能被覆盖。当然,其他的res有自己的执行状态(否则,你怎么能可靠地编程呢?)如果你正在编写一个线程程序,你通常必须关注全局可见内存的状态,而不是只在本地使用的寄存器或内存。谢谢@unwind。我只是想在virtula多核环境中,多核同时出现。r14有可能被覆盖。当然,其他的res有自己的执行状态(否则,你怎么能可靠地编程呢?)如果你正在编写一个线程程序,你通常必须关注全局可见内存的状态,而不是只在本地使用的寄存器或内存。谢谢@unwind。我只是想在virtula多核环境中,多核同时出现。r14有可能被覆盖。当然,其他的res有自己的执行状态(否则,你怎么能可靠地编程呢?)如果您正在编写线程程序,您通常必须关注全局可见内存的状态,而不是只在本地使用的寄存器或内存。是的@dwelch,这与我们在x86中使用的调用方保存约定类似。这是一种独立于目标的解决方案/约定。使用堆栈保留本地(函数、范围)信息。是@dwe