想要讀懂啟動文件,需要一些基本的匯編基礎。
1 在匯編語言中,注釋是 ;
2匯編ARM指令DCD
DCD ( DCDU )用于分配一片連續(xù)的字存儲單元并用指定的數(shù)據(jù)初始化。
語法格式:
標號 DCD (或 DCDU ) 表達式
DCD (或 DCDU )偽指令用于分配一片連續(xù)的字存儲單元并用偽指令中指定的表達式初始化。其中,表達式可以
為程序標號或數(shù)字表達式。 DCD 也可用 “ & ” 代替。
用 DCD 分配的字存儲單元是字對齊的,而用 DCDU 分配的字存儲單元并不嚴格字對齊。
使用示例:
DataTest DCD 4 , 5 , 6 ;分配一片連續(xù)的字存儲單元并初始化。
3 [weak] 的意思是該函數(shù)優(yōu)先級比較弱,如果其它地方定義了一個同名函數(shù),那么此處的這個函數(shù)就被取代了。
語法格式為 EXPORT 標號 {[WEAK]} 。EXPORT 可用GLOBAL代替。
4AREA指令的理解
AREA指令是一個偽指令,用于段定義。ARM匯編程序由段組成,段是相對獨立的指令或數(shù)據(jù)單位,每個段由AREA
偽指令定義,并定義段的屬性。
AREA參數(shù)說明:
*STACK——AREA指令的一個參數(shù),定義段名稱
*NOINIT——AREA指令的一個參數(shù),指定本數(shù)據(jù)段僅僅保留了內在單元,而將句初始值寫入內存單元,此時內存單元值初始化為0
*READWRITE——指定本段為可讀可寫,數(shù)據(jù)段默認為READWRITE.
READWRITE(讀寫)、READONLY(只讀)
*ALIGN——也是一個偽指令,指定對齊方式。ALIGN n 指令的對齊值有兩種選擇:n或者2^n
例子:開辟一個堆棧段,段名為STACK,定義為可讀可寫,將內存單元初始化為0,對齊方式為8字節(jié)對齊。
AREA STACK,NOINIT,READWRITE,ALIGN=3
;********************(C)COPYRIGHT2011STMicroelectronics********************
;*FileName:startup_stm32f10x_hd.s
;*Author:MCDApplicationTeam
;*Version:V3.5.0
;*Date:11-March-2011
;*Description:STM32F10xHighDensityDevicesvectortableforMDK-ARM
;*toolchain.
;*Thismoduleperforms:
;*-SettheinitialSP
;*-SettheinitialPC==Reset_Handler
;*-SetthevectortableentrieswiththeexceptionsISRaddress
;*-Configuretheclocksystemandalsoconfiguretheexternal
;*SRAMmountedonSTM3210E-EVALboardtobeusedasdata
;*memory(optional,tobeenabledbyuser)
;*-Branchesto__mainintheClibrary(whicheventually
;*callsmain()).
;*AfterResettheCortexM3processorisinThreadmode,
;*priorityisPrivileged,andtheStackissettoMain.
;*<<
;*******************************************************************************
;THEPRESENTFIRMWAREWHICHISFORGUIDANCEONLYAIMSATPROVIDINGCUSTOMERS
;WITHCODINGINFORMATIONREGARDINGTHEIRPRODUCTSINORDERFORTHEMTOSAVETIME.
;ASARESULT,STMICROELECTRONICSSHALLNOTBEHELDLIABLEFORANYDIRECT,
;INDIRECTORCONSEQUENTIALDAMAGESWITHRESPECTTOANYCLAIMSARISINGFROMTHE
;CONTENTOFSUCHFIRMWAREAND/ORTHEUSEMADEBYCUSTOMERSOFTHECODING
;INFORMATIONCONTAINEDHEREININCONNECTIONWITHTHEIRPRODUCTS.
;*******************************************************************************
;Amountofmemory(inbytes)allocatedforStack
;Tailorthisvaluetoyourapplicationneeds
;
;
;
Stack_SizeEQU0x00001000;定義棧大小為40960x1000=4096
AREASTACK,NOINIT,READWRITE,ALIGN=3
Stack_MemSPACEStack_Size
__initial_sp
;
;
;
Heap_SizeEQU0x00001000;定義堆的空間為1024
AREAHEAP,NOINIT,READWRITE,ALIGN=3
__heap_base
Heap_MemSPACEHeap_Size
__heap_limit
PRESERVE8
THUMB
;VectorTableMappedtoAddress0atReset
AREARESET,DATA,READONLY
EXPORT__Vectors
EXPORT__Vectors_End
EXPORT__Vectors_Size
__VectorsDCD__initial_sp;TopofStack
DCDReset_Handler;ResetHandler