|
1黑幣
下面的代碼是從STM32F429的啟動(dòng)文件 startup_stm32f429xx.s中摘抄的關(guān)于棧區(qū)定義的匯編代碼:
Stack_Size EQU 0x400; ……………………………………………………第1行
AREA STACK, NOINIT, READWRITE, ALIGN=3 ………..第2行
Stack_Mem SPACE Stack_Size …………………………………………………..第3行
__initial_sp …………………………………………………………………………………….第4行
(1)這4行語(yǔ)句中有3個(gè)偽指令“EQU,AREA ,SPACE”,共4行代碼,只有第1行的代碼后面有一個(gè)分號(hào)“;”,其他3行都沒(méi)有,這是怎么回事?
(2)第1行代碼定義了一個(gè)變量Stack_Size且 Stack_Size==0x400,這我可以理解,沒(méi)啥問(wèn)題。
(3)第2行代碼,是偽指令A(yù)REA,定義了一個(gè)數(shù)據(jù)段段名為STACK的內(nèi)存空間,不初始化或不初始化為0,可讀可寫(xiě),并以8字節(jié)對(duì)齊。這個(gè)8字節(jié)對(duì)齊是什么概念?為什么要8字節(jié)對(duì)齊?
(4)第3行代碼中,SPACE Stack_Size是開(kāi)辟一個(gè)大小為0x400的內(nèi)存空間,那么"Stack_Mem"是標(biāo)號(hào)嗎?是表示開(kāi)辟的這個(gè)內(nèi)存空間的名稱(chēng)是Stack_Mem么?本來(lái)我也認(rèn)為Stack_Mem是一個(gè)定義的內(nèi)存空間的名稱(chēng),可是在“.MAP”文件中,Stack_Mem的值卻是個(gè)地址(如下灰色區(qū)域所示),可以看出Stack_Mem==0x20000388,它不是內(nèi)存空間么,怎么會(huì)是0x20000388?而不是0x400=1024KB,為什么?
Symbol Name Value Ov Type Size Object(Section)
.data 0x2000001c Section 4 usart.o(.data)
.bss 0x20000020 Section 264 usart.o(.bss)
.bss 0x20000128 Section 96 libspace.o(.bss)
HEAP 0x20000188 Section 512 startup_stm32f429xx.o(HEAP)
Heap_Mem 0x20000188 Data 512 startup_stm32f429xx.o(HEAP)
STACK 0x20000388 Section 1024 startup_stm32f429xx.o(STACK)
Stack_Mem 0x20000388 Data 1024 startup_stm32f429xx.o(STACK)
__initial_sp 0x20000788 Data 0 startup_stm32f429xx.o(STACK)
(5)第4行代碼中,“_initial_sp”表示棧頂指針,_initial_sp是怎么來(lái)的?那我隨便寫(xiě)個(gè)字符都可以表示棧頂指針了??比如我用“initial_sp”替代“_initial_sp”,那么initial_sp也可以表示棧頂指針了?
|
|