我正在爲我的覆盆子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
我很好奇,因爲這是h流XV6這樣做,
movl $(V2P_WO(entrypgdir)), %eax
它編譯罰款,
$ gcc -m32 -c -o entry.o entry.S
它說的是我的工具鏈?或者在ARM不可能?
您正在編譯的代碼使用'%eax'?這是** x86 **彙編器?你確定* source/_start.S *是ARM代碼嗎?通常'gas'會去嘗試編譯** x86 **彙編程序,因爲它是ARM代碼,並且不會給出指出問題的錯誤診斷。 ARM寄存器是* r0-r15 *,並有一些特殊的名稱,如* lr,sp,ip,fp,pc *。像'eax ebx esi,edx al ah'這樣的寄存器是代碼爲'x86'的好線索。我得到了最新的* git repo *,這個代碼是** x86 **。你會有很多問題使用這個。我會建議eCos,uCos,rtems等。 – 2013-03-28 14:19:37
你必須看錯地方;)我的代碼更早,「_start.S」。 – jsz 2013-03-28 14:26:43
對不起,我沒有得到你正在將此移植到ARM,而不是按原樣編譯。那是對的嗎?然後,我認爲[auselen](http://stackoverflow.com/users/1163019/auselen)是正確的。另請參見[arm中的重定位](http://stackoverflow.com/questions/15671717/relocation-in-assembly)。 – 2013-03-28 14:29:58