ARM汇编中的STR和LDR指令

时间:2016-11-22 13:05:11

标签: assembly arm inline-assembly cortex-a

我试图将为arm926ejs编写的简单RTOS移植到arm cortex-A9。在引用上下文切换时,我遇到了以下说明,

_userIntrStackPtr:
    .word   0x0  

STR     sp,_userIntrStackPtr

LDR     r0,__userStackPtr2Ptr

但是,当我尝试编译代码时,我收到错误

Error: internal_relocation (type: OFFSET_IMM) not fixed up

有人可以解释一下上述说明吗?此外,当我提到其他代码时,我看到类似的指令,如

LDR     r0,=__userStackPtr2Ptr

这两种方法有什么区别?如何使用str和ldr指令使用这些标签? 我不喜欢集会。请帮忙..

1 个答案:

答案 0 :(得分:2)

指令的给定形式使用PC相对寻址,并且一些汇编器可能对它们施加限制,例如符号必须在相同的部分中,因此偏移是已知的。如上所示的上述代码与gnu汇编程序2.24.51.20131021组合在一起。我猜你没有提供实际的MCVE。

对于问题的第二部分:=加载地址,因此您需要另一个LDR / STR来执行内存操作。例如:

LDR r0, =_userIntrStackPtr
STR sp, [r0]
LDR r0, =__userStackPtr2Ptr
LDR r0, [r0]