2011-03-14 63 views
3

我想在我的彙編文件指定一個512×32位陣列,這看起來如下:指定數組中彙編

#define FUNCTION_01  test 
#define LABEL_01(name) .L ## test ## _ ## name 

    .section ".data" 
    my_array: 
    .word 0x10101010 
    .word 0x20101010 
    .word 0x30101010 
    .word 0x40101010 
    ... 

    .section ".text" 
    .align 4 
    .global FUNCTION_01 
    .type FUNCTION_01,#function 

FUNCTION_01: 

    add %g0, 12, %l7   
    ld [%l7 + my_array], %l7 
    ...  
    ret 
    restore 

    LABEL_01(end): 
    .size FUNCTION_01,LABEL_01(end)-FUNCTION 

所以我嘗試在function_01做的是訪問4個元素我的陣列。然而,當我嘗試編譯上面裝配了SPARC架構我得到以下錯誤:

(.text+0x75c): relocation truncated to fit: R_SPARC_13 against `.data' 
collect2: ld returned 1 exit status 

不知道從這個錯誤中做什麼。這是否意味着數組很大或者我在代碼中有其他錯誤?

回答

2

警告:我從來沒有使用sparc程序集,但看到沒有人回答,我做了一個快速教程,看看我能否提供幫助。

根據this pageld指令中的常量必須是當前值的4KiB以內的偏移量。你正試圖添加一個地址,而不是偏移量,這就是爲什麼你會得到錯誤。另外,數據部分可能會比​​文本部分多4 KiB。你需要做的是把數組的地址放在%17中,並使用這12個字節作爲常量到ld。爲此,您可以使用set指令(這實際上不是一條指令,彙編器將其更改爲sethior組合。)。

set my_array,%l7 
ld [%l7 + 12],%l7 
0

ld [%l7 + my_array], %l7指令被組裝到一個32位的操作碼,其中包含(除其他外)爲my_array值的13位字段(即,陣列地址)。錯誤信息是鏈接器告訴你它在將一個32位地址裝入一個13位字段時遇到麻煩......

要將32位地址加載到寄存器中,必須使用兩條指令,即sethi(其設置高22位)和or(設置低10位)。這看起來像這樣:

sethi %hi(my_array), %l7 
or  %l7, %lo(my_array), %l7 
ld  [%l7+12], %l7 

訪問第四個數組元素。前兩個指令可以與僞指令set取代:

set my_array, %l7 
ld  [%l7+12], %l7 

其產生相同的機器代碼。無論哪種方式,彙編程序都會生成一個帶有22位字段的sethi操作碼和一個帶有10位數據字段的or操作碼,並將這些操作碼的位置寫入目標文件元數據。鏈接器獲取所有對象文件並確定my_array數組最終放入RAM的位置,填充這些字段。注意:如果您打算將您的代碼放入共享庫(.so文件)中,則情況會更復雜。