我正在为 Raspberry Pi 编写一些裸机代码,并且从 Windows 上的 ARM 交叉汇编器收到意外警告。引起警告的指令是:
stmdb sp!,{r0-r14}^
和
ldmia sp!,{r0-r14}^
警告是:
Warning: writeback of base register is UNPREDICTABLE
我可以理解这一点,因为虽然'^'修饰符告诉处理器存储寄存器的用户模式副本,但它不知道执行指令时处理器将处于什么模式,并且没有'这似乎是一种讲述它的方式。我更担心收到同样的警告:
stmdb sp!,{r0-r9,sl,fp,ip,lr}^
和:
ldmia sp!,{r0-r9,sl,fp,ip,lr}^
尽管事实上我明确不存储任何 sp 寄存器。
我担心的是,虽然大约 15 年前我曾经做过很多汇编程序编码,但 ARM 代码对我来说是新的,我可能会误解一些东西!另外,如果我可以安全地忽略这些警告,有什么方法可以抑制它们吗?
最佳答案
ARM架构引用手册说用户寄存器的LDM/SMT不允许写回。在异常返回的情况下是允许的,其中pc
在寄存器列表中。
LDM(异常返回)
LDM{<amode>}<c> <Rn>{!},<registers_with_pc>^
LDM(用户寄存器)
LDM{<amode>}<c> <Rn>,<registers_without_pc>^
关于arm - GNU ARM 汇编器上的意外警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15373952/