2014-10-17 62 views
2

我有一個關於符號的放置在符號表中,然後你如何從內部C.引用這些符號地址中()中獲取價值從符號表

所以我們可以說我有一個啓動組件的問題文件,在調用main()之前完成一些基本的東西。它所做的一件事就是導出定義堆棧的幾個符號。

St_Length  EQU  0x00000400 

       AREA STACK, NOINIT, READWRITE, ALIGN=3 
       EXPORT St_Length 
       EXPORT ra_Stack 
ra_Stack  SPACE St_Length 

然後在由source.c文件中,我要引用這些符號我有類似:

extern uint32_t St_Length; /* exported from asm.s */ 
void func(void) 
{ 
    uint32_t i; 
    for(i = 0; i < (uint32_t)(&St_Length); ++i) 
     \\do something 
} 

這似乎正常工作,即它實際上執行循環0x400的時間。我的問題是爲什麼我必須使用&符號才能得到我所喜歡的應該是的值的符號,而不是的地址的符號?

注意:這是針對使用Keil提供的工具鏈的ARM Cortex-M3。

感謝您的幫助。

編輯:這裏是我的符號表從生成的地圖文件中的相關部分:

Global Symbols 

    Symbol Name        Value  Ov Type  Size Object(Section) 


    St_Length        0x00000400 Number   0 startup_stm32f10x_md.o ABSOLUTE 

符號表中「類型」一欄的任何解釋,將是非常有幫助了。

回答

0

因爲使用EQU您已將St_Length定義爲地址0x400的符號。將其定義爲在一些適當的地址的變量,你應該嘗試沿着線的東西:

St_Length DCD 0x400 

(把這個在您的數據區。)

+0

爲什麼對*地址* 0x400的一個符號?爲什麼不只是數字常量0x400的符號?從ARM彙編程序手冊「使用EQU定義常量」,這與使用#define在C中定義常量類似。我不希望它是一個實際的變量,它佔用了內存中的空間,這是DCD將實現的。 – NickHalden 2014-10-17 23:48:30

+1

你不能在C中這樣做。如果你在另一個C模塊中定義常量,比如'const int St_Length = 0x400;',那也會佔用空間。不幸的是,你的模塊是組裝的,對此沒有影響。 'EQU'在你的asm文件中工作,因爲asm默認處理地址,你需要應用解引用來獲取值。 C默認處理值,並且您需要應用address-of運算符來獲取地址。 – Jester 2014-10-17 23:56:09

+0

你能指點我一些參考嗎?在彙編程序手冊http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0489h/Caccddic.html中,它似乎暗示了其他情況。 「abc EQU 2;將值2賦給符號abc。」 如果你所說的話是正確的,這似乎是瘋狂的誤導。 – NickHalden 2014-10-18 01:29:15