2013-03-28 27 views
1

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

+0

您正在編譯的代碼使用'%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

+0

你必須看錯地方;)我的代碼更早,「_start.S」。 – jsz 2013-03-28 14:26:43

+0

對不起,我沒有得到你正在將此移植到ARM,而不是按原樣編譯。那是對的嗎?然後,我認爲[auselen](http://stackoverflow.com/users/1163019/auselen)是正確的。另請參見[arm中的重定位](http://stackoverflow.com/questions/15671717/relocation-in-assembly)。 – 2013-03-28 14:29:58

回答

2

嘗試此代替

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

中間體值在mov指令需要被嵌入在指令,使得需要在編譯時是已知的並且也爲地址使用,則無法通過加載任何32位值mov迫使你回落到ldr

+0

謝謝!它現在編譯好了。給我一些時間讓它工作:) – jsz 2013-03-28 14:38:39

+0

@jsz嘗試儘可能多地使用objdump。它通常是最好的工具。 – auselen 2013-03-28 18:10:57

相關問題