我正在为我的覆盆子pi编写一个玩具操作系统,我正在使用xv6作为参考。
当我尝试加载另一个文件(在C中)中定义的“entrypgdir”符号时,我的代码出现编译错误。
_start.S:
#include "mem.h"
.globl entry
entry:
mov r0, #(V2P_NOCAST(entrypgdir))
V2P_NOCAST是一个在.h文件中定义为
的简单宏mem.h:
#define V2P_NOCAST(va) ((va) - KERNBASE)
错误:
$ arm-none-eabi-gcc -c -o build/_start.o source/_start.S
source/_start.S: Assembler messages:
source/_start.S:17: Error: undefined symbol entrypgdir used as an immediate value
我很好奇,因为xv6就是这样做的,
movl $(V2P_WO(entrypgdir)), %eax
它编译得很好,
$ gcc -m32 -c -o entry.o entry.S
我的工具链是什么东西?或者它在ARM中不可能?
答案 0 :(得分:2)
试试这个
entry:
ldr r0, =(V2P_NOCAST(entrypgdir))
mov
指令中的中间值需要嵌入到指令中,因此需要在编译时以及地址使用时知道,你不能通过mov加载任何32位值,这会迫使你退回到ldr
。