问题描述
我需要编写一个函数,在工作之后将除r0-r3以外的所有寄存器都设置为其初始值。我使用推入和弹出,但是找不到哪个寄存器存储CMP的值。
UPD 。谢谢。看来我错了。我的作业有一个提示:“不要忘记保存被调用者的寄存器”,因此它并不建议将标志视为已保存被调用者)
解决方法
cmp
,就像所有带有s
后缀的subs
的ARM指令一样, s et标志/条件代码。这些条件代码存在于称为CPSR
的寄存器Current Program Status Register中。也是https://en.wikipedia.org/wiki/ARM_architecture#Registers
在所有标准函数调用约定中,标志/条件代码都被调用。 您不需要保存/恢复呼叫者的CPSR。只需将其与r0..3。一起进行呼叫处理即可。
但是,如果您这样做了,请参见https://heyrick.eu/armwiki/The_Status_register以获得诸如
MRS R0,CPSR ; Copy CPSR into R0
...
MSR CPSR,R0 ; Copy R0 into CPSR