程序集 - 将其他目标文件中的符号用作立即值

时间:2013-03-28 03:18:01

标签: assembly arm raspberry-pi

我正在为我的覆盆子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中不可能?

1 个答案:

答案 0 :(得分:2)

试试这个

entry:
    ldr r0, =(V2P_NOCAST(entrypgdir))

mov指令中的中间值需要嵌入到指令中,因此需要在编译时以及地址使用时知道,你不能通过mov加载任何32位值,这会迫使你退回到ldr