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!
回到目录页