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
符號表中「類型」一欄的任何解釋,將是非常有幫助了。
爲什麼對*地址* 0x400的一個符號?爲什麼不只是數字常量0x400的符號?從ARM彙編程序手冊「使用EQU定義常量」,這與使用#define在C中定義常量類似。我不希望它是一個實際的變量,它佔用了內存中的空間,這是DCD將實現的。 – NickHalden 2014-10-17 23:48:30
你不能在C中這樣做。如果你在另一個C模塊中定義常量,比如'const int St_Length = 0x400;',那也會佔用空間。不幸的是,你的模塊是組裝的,對此沒有影響。 'EQU'在你的asm文件中工作,因爲asm默認處理地址,你需要應用解引用來獲取值。 C默認處理值,並且您需要應用address-of運算符來獲取地址。 – Jester 2014-10-17 23:56:09
你能指點我一些參考嗎?在彙編程序手冊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