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]
我试图将为 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]