ARM 汇编中的 STR 和 LDR 指令

STR and LDR instruction in ARM Assembly

我试图将为 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 指令一起使用? 我不擅长组装。请帮忙..

指令的给定形式使用 PC 相对寻址,一些 assemblers 可能对其施加限制,例如符号必须位于同一部分以便知道偏移量。上面显示的代码确实 assemble 和 gnu assembler 2.24.51.20131021。我猜你没有提供实际的 MCVE。

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

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