2017-10-06 53 views
2

我有一個彙編代碼(hello1.s),其中定義了全局標籤A_Td,我想訪問使用全局標籤定義的所有長數據值A_Td從C程序中/從內部進入無法從linux中訪問C程序集的正確全局標籤數據

.file "hello1.s" 
.globl A_Td 
.text 
.align 64 
A_Td: 
    .long 1353184337,1353184337 
    .long 1399144830,1399144830 
    .long 3282310938,3282310938 
    .long 2522752826,2522752826 
    .long 3412831035,3412831035 
    .long 4047871263,4047871263 
    .long 2874735276,2874735276 
    .long 2466505547,2466505547 

作爲A_Td在文本部分中所定義,因此它被放置在代碼段和僅一個副本加載到存儲器中。

使用YASM,我已經產生hello1.o文件

yasm -p gas -f elf32 hello1.s 

現在,訪問使用全局標籤A_Td所有長數據,我寫了下面的C代碼(test_glob.c)採取從線索這裏global label

//test_glob.c 
extern A_Td ; 

int main() 
{ 
    long *p; 
    int i; 
    p=(long *)(&A_Td); 
    for(i=0;i<16;i++) 
    { 
     printf("p+%d %p %ld\n",i, p+i,*(p+i)); 
    } 
    return 0; 
} 

使用以下命令我編譯了C程序,然後運行C代碼。

gcc hello1.o test_glob.c 
./a.out 

我得到以下輸出

p+0 0x8048400 1353184337 
p+1 0x8048404 1353184337 
p+2 0x8048408 1399144830 
p+3 0x804840c 1399144830 -----> correct till this place 
p+4 0x8048410 -1012656358 -----> incorrect value retrieved from this place 
p+5 0x8048414 -1012656358 
p+6 0x8048418 -1772214470 
p+7 0x804841c -1772214470 
p+8 0x8048420 -882136261 
p+9 0x8048424 -882136261 
p+10 0x8048428 -247096033 
p+11 0x804842c -247096033 
p+12 0x8048430 -1420232020 
p+13 0x8048434 -1420232020 
p+14 0x8048438 -1828461749 
p+15 0x804843c -1828461749 

ONLY第一4個長值被正確地從C程序訪問。爲什麼發生這種情況?

在C程序中需要做些什麼才能正確訪問其餘數據?

我正在使用Linux。任何幫助解決這個問題或任何鏈接將是一個很大的幫助。提前致謝。

+2

@old_timer'extern long * A_Td;'不會工作(並且可能會崩潰),但'extern long A_Td [];'應該工作(假設C'long'與彙編器的大小相同。 ')。 –

+0

右側需要一個間接的級別。 –

+0

我在想功能標籤或單個項目,你可以直接使用...忘了地址存儲。 –

回答

1

「long」在這個系統中有多少個字節?

在我看來,那printf的解釋這些數字作爲四個字節有符號整數,其中值3282310938有十六進制值C3A4171A,也就是上面7FFFFFFF(十進制:2147483647),這是最大的四個字節的正符號數,和因此負值爲-1012656358。 我假設彙編器只是將這四個字節數解釋爲無符號數。

如果您使用%lu而不是%ld,printf會將這些數字解釋爲無符號數,並應顯示您的預期。

+0

@FrankPI,在我的系統中,sizeof(long)返回4,意味着long需要4bytes。 – bholanath

+0

@bholanath:**簽名** 32位整數的最小值和最大值是多少? – Mat

+0

@FrankPI,我得到了正確的價值打印爲十六進制,因爲你指出使用%lx而不是%ld。謝謝你的及時答覆。 – bholanath