1

ラズベリーパイ用のおもちゃのOSを書いていて、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では不可能ですか?

4

1 に答える 1

2

代わりにこれを試してください

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

命令の中間値をmov命令に埋め込む必要があるため、コンパイル時およびアドレスの使用時に知る必要があります。mov を介して 32 ビット値をロードすることはできず、ldr.

于 2013-03-28T09:14:15.277 に答える