ARM指令定址問題
ENTRY
BootloAd
LDRr0, =0x00
LDRr1, =0x00
LDRr2, =0x00
LDRr3, =0x00
END
1)在ARM程序里,如何指定指令在ROM中存放的位置(類似單片機的ORG偽指令)
我想不管哪款ARM芯片,肯定都有上電復位地址,也就是上電后PC指向的位置。比如某款ARM芯片復位地址為0x00000000,復位后我希望執(zhí)行的第一條指令是LDR R0, =0x00。那么在程序里我們怎么指定將該條指令放在ROM的0x00位置呢?
2)ENTRY偽指令的作用
ENTRY偽指令是程序的入口,一個程序只能有一個ENTRY,在生成ELF格式的IMAGE文件時,它能夠告訴仿真器從哪條指令開始執(zhí)行程序,但是在生成BIN文件時,它又有什么用呢??我們希望將ENTRY下面的那條指令燒錄到ARM芯片的上電復位地址處,每款芯片的復位地址都可能不同,ADS如何能通過ENTRY就知道實際芯片的復位地址在哪里?
3)ARMLINKER配置時RO BASE的作用
我在ARMLINKER的配置頁里將RO BASE設置為0x3000,通過用AXD裝載生成的AXF文件仿真,觀察發(fā)現(xiàn),LDRr0, =0x00這條指令被放在存儲器的0x3000位置,這似乎說明通過設置RO BASE可以設置程序在ROM中的起始位置。但我看同時生成的BIN文件,只有16個字節(jié),那如果用燒錄器燒芯片時,燒錄器如何知道BIN文件的第一個字節(jié)要放在ROM的0x3000位置呢?(不通過填寫燒錄軟件里的燒錄起始地址為0x3000)
VECTORS。S是在ADS中設定的: vector.s中"section"=STARTUP為首運行。
類似的。 復位后是中斷向量表。第一個是復位向量,在那里
放一個跳轉(zhuǎn)。(一般才幾個字節(jié)大小,只能放跳轉(zhuǎn)了)
跳轉(zhuǎn)到:
1。初始化的代碼處。InitStAck 初始化堆棧。。。
2。C 的 _MAIN 地址,運行 MAIN()
vector.s應該是自己寫的ARM匯編,不是每個項目都會有vector.s文件的吧?
另外,就算在section指定了STARTUP為首運行,怎么將該條指令和硬件的復位地址對上呢?
是這樣的:
CODE32
AREAStArtup,CODE,READONLY
ENTRY
;//中斷向量表每個寬 4個字節(jié)。只能放一條32位的ARM指令。
Vectors;BASE+0
LDRPC, ResetAddr;復位的第一條。跳到標號;ResetAddr
LDRPC, UndefinedAddr ;32位的ARM指令。 BASE+1
LDRPC, SWI_Addr;32位的ARM指令。 BASE+2
LDRPC, PrefetchAddr
LDRPC, DAtAAbortAddr
DCD0xb9205f80
LDRPC,[PC, #-0xff0]
LDRPC,FIQ_Addr
...
ResetAddr:
BLInitStAck
B_MAIN
跳轉(zhuǎn)到:
1。初始化的代碼處。InitStAck 初始化堆棧。。。
2。C 的 _MAIN 地址,運行 MAIN()
假設我的工程中 vector.s是初始化文件。
其主要內(nèi)容為:
CODE32
AREAStArtup,CODE,READONLY
ENTRY
;//中斷向量表每個寬 4個字節(jié)。只能放一條32位的ARM指令。
Vectors;BASE+0
LDRPC, ResetAddr;復位的第一條。跳到標號;ResetAddr
LDRPC, UndefinedAddr ;32位的ARM指令。 BASE+1
LDRPC, SWI_Addr;32位的ARM指令。 BASE+2
LDRPC, PrefetchAddr
LDRPC, DAtAAbortAddr
DCD0xb9205f80
LDRPC,[PC, #-0xff0]
LDRPC,FIQ_Addr
...
ResetAddr:
BLInitStAck
B_MAIN
;=======================================
所以需要在ADS中設定
object/symbol: vector.o,"section"=STARTUP為首運行。
;=======================================
上電復位后,程序從entry處進入。
則第一條指令就是:LDRPC, ResetAddr
那么PC指針跳轉(zhuǎn)到ReseAddr標號處。
你可以在這里實現(xiàn)初始化功能。
有不對的地方希望各位指正。
評論