32 位规则

EMBEST ARM

32 位规则

 

  • 不要使用有 P 后缀的测试指令: TEQP、TSTP、CMPP、CMNP。
  • 检查更改 PC、R14 的如 BIC 和 ORR 这样的指令,和把一个寄存器复制到 PC 的指令。例如,ORRS PC, R14, #1<<28 将不能工作。实际上,不要使用带 S 标志设置的写到 PC 的任何指令。
  • 在数据处理操作中不要使用 R15 (PC) 作为移位寄存器。
  • 在 LDR/STR 中,不要使用 PC 作为寄存器偏移量并不要写回到它。
  • 在过后变址 LDR/STR 中,Rm(变址)和 Rn(基址)不能是同一个寄存器。类似的,对于涉及写回的任何指令,Rm 和 Rn 都应该是不同的寄存器。
  • LDM/STM 在用户模式下不使用 S 位。这意味着,不要使用‘^’后缀(例如 LDMFD R13!, {PC}^)。
  • BL 不保存状态寄存器。这必须显式的进行,但是这样的代码将不能在 ARM2 或 ARM3 上运行,因为它们不支持 MRS/MSR 指令。
  • 还要注意,不可能见到被调用者的标志,所以不应该恢复你不知道其状态的标志。你能做的最好的就是在进入的时候保护标志。

 

任何带 S 位设置的到 R15 的 32-bit 写(MOVS、ORRS、TEQP、LDM...^) 将传送当前模式的 SPSR 到 CPSR 中。例如,假定我们在 irq_32 模式下:

  MOVS PC, R14
将复制 R14 到 PC,并接着复制 SPSR_IRQ32 到 CPSR。

这在 USR 模式下不是非常有用因为它没有 SPSR!

 


回到目录页