我需要编写一个函数,在工作后将除 r0-r3 之外的所有寄存器设置为其初始值。我使用push和pop,但找不到哪个寄存器存储CMP的值。
升级版。谢谢你。看来我错了。我有一个暗示的任务:“不要忘记被调用者保存寄存器”,所以它并不建议将标志视为被调用者保存)
我需要编写一个函数,在工作后将除 r0-r3 之外的所有寄存器设置为其初始值。我使用push和pop,但找不到哪个寄存器存储CMP的值。
升级版。谢谢你。看来我错了。我有一个暗示的任务:“不要忘记被调用者保存寄存器”,所以它并不建议将标志视为被调用者保存)
cmp,就像所有带有s后缀的subsARM 指令一样,设置标志/条件代码。这些条件代码存在于一个称为当前程序状态寄存器的寄存器中。还有https://en.wikipedia.org/wiki/ARM_architecture#RegistersCPSR
在所有标准的函数调用约定中,标志/条件代码都是调用破坏的。 您不需要保存/恢复调用者的 CPSR。 只要让它与 r0..3 一起被调用破坏。
但是,如果您这样做了,请参阅https://heyrick.eu/armwiki/The_Status_register以获取诸如
MRS R0, CPSR ; Copy CPSR into R0
...
MSR CPSR, R0 ; Copy R0 into CPSR