【问题标题】:Which register does store cmp result in arm?哪个寄存器将 cmp 结果存储在 arm 中?
【发布时间】:2021-01-23 17:49:04
【问题描述】:

我需要编写一个函数,在工作后将除 r0-r3 之外的所有寄存器设置为其初始值。我使用push和pop,但是找不到哪个寄存器存储CMP的值。

UPD。谢谢你。看来我错了。我的作业有一个提示:“不要忘记被调用者保存寄存器”,所以它并不建议将标志视为被调用者保存)

【问题讨论】:

  • 那就是CPSR。但是你不能直接访问CPSR;相反,您可以通过例如间接访问它条件分支指令。
  • 函数一般不关心标志,中断是,函数不关心。根据内核,它可能已经在为您执行此操作(用于中断)
  • 您正在为哪个 ARM 变体编程?
  • 如果您的问题需要与原始问题完全不同的答案,请提出新问题。我回滚了你的大部分编辑,这把这变成了一个完全不同的问题,关于调试你对某事的尝试。如果我的回答回答了这个问题,您可以使用投票箭头下方的复选框将其标记为“已接受”。

标签: assembly arm cpu-registers calling-convention status-register


【解决方案1】:

cmp,就像所有带有s 后缀的 ARM 指令一样,如subss等标志/条件代码。这些条件代码位于名为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

【讨论】:

    猜你喜欢
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多