2012-04-10 39 views
8

我最近開始爲arm核心組裝編程。我的第一個小演示,只有.text部分,沒有任何問題。內部重新定位未修復

作爲一個邏輯擴展,我想將彙編代碼構造成通常的部分:.text,.data,.bss。

所以我寫了下面的程序:

.globl _start 

.section .text 

_start: 
    b main 
    b . 
    b . 
    b . 
    b . 
    b . 
    b . 
    b . 


main: 
    ldr r0, x 
    nop 

.section .data 

x: .word 0xf0f0f0f0 

.end 

/opt/arm/bin/arm-as -ggdb -mcpu=arm7tdmi demo.s -o demo.o 

退出時錯誤

prog.s: Assembler messages: 
prog.s:17: Error: internal_relocation (type: OFFSET_IMM) not fixed up 
make: *** [prog.o] Error 1 

我不知道爲什麼彙編抱怨搬遷,因爲我認爲這是鏈接器的任務。我可以想象,我必須告訴彙編程序,我的.data部分不在組裝階段的最後內存位置,但我找不到任何相關的東西。

儘管我發現了一種由

.org . 

這不是一個令人滿意的解決方案,以獲得正確安裝後,代碼通過更換

.section .data 

。特別是鑑於氣體文件突出了這一部分的意義。

也許你專家有人能幫助我獲得一些智慧

回答

13

看來你能做到這一點是通過抓取變量的地址並加載來自該地址的值的唯一途徑。

ldr r1,=x ; get address of x 
ldr r0,[r1] ; load from that address 

從某種意義上說,這也是有道理的。畢竟,如果x(鏈接後)的地址對於PC相對訪問來說太遠了,該怎麼辦?由於編譯器(不進行鏈接)不知道數據段距文本段有多遠,因此它會拒絕編譯該代碼以防萬一它無法訪問。

通過使用這種訪​​問變量的間接方式,可以保證變量可以被訪問(或者至少編譯器可以確定變量是否可達)。

代碼改編自http://www.zap.org.au/elec2041-cdrom/examples/intro/pseudo.s

+0

謝謝您的解釋和示例。這個或類似的東西應該放入binutils文檔的arm部分。我會記住鏈接器的規模很大,編碼器的規模較小。如果我有一些額外的時間,我會研究一些拆解的C程序,並希望獲得更多的見解... – user1146332 2012-04-16 13:08:34

+0

這是公認的答案? – aditya 2013-04-23 12:30:40