[問題]ARM assembly 起始位置

作者: student23489 (雲§淡)   2022-01-19 23:25:03
最近在學習arm assembly,之前有寫過8051,想詢問arm要怎麼使用51的org偽指令功能
我參考了armKEIL官方的compiler reference guide:https://reurl.cc/pW178e
但寫了後,compiler都不會過,不曉得是不是小弟語法使用錯誤,請前輩糾正
程式碼
https://imgur.com/kIEOnc5
https://imgur.com/WqPsL6N
只要加上org這行就會讓編譯產生錯誤
.org 1b + 0x55
LDR R0, = SystemInit
BLX R0
或是有沒有其他方法可以指定初始位置?因為我看跳LABEL的地址都是由compiler賦予的
在這先謝謝各位前輩
作者: Lipraxde (Lipraxde)   2022-01-20 01:00:00
沒仔細看,不過你文件是 v6,compiler 似乎是 v5 的?
作者: breeze08 (linuxer)   2022-01-20 01:37:00
你這看起來像是stm32?一般來說是不應該改startup檔才對對,因為這都是固定流程,其中包括了進行C語言的runtime初始化,如果任意更改可能導致啟動行為不正確。如果真的要更改的話首先你要確定你想改的是哪個地方,因此理解硬體上電後的動作是必要的,一般來說上電後會從vector table中取出Reset handler地址來執行,假如你想更改的是執行你的程式,那你應該直接更改reset handler的內容而非去調整reset handler的地址那假如你現在是要啟動後要跳去指定的地址執行放置在特定地址的程式碼,也就是要直接設定Reset handler本身所在地址的話,那你要更改的應該是linker script的內容你提到的.org指令我沒用過,但其目的應該跟更改linkerscript是類似的
作者: descent (「雄辯是銀,沉默是金」)   2022-01-20 08:59:00
如果你的 arm 是 stm32/cortex-m, 可以參考https://bit.ly/350bKh3
作者: student23489 (雲§淡)   2022-01-20 22:39:00
原來這是V6的compiler!沒注意到這一點,謝謝提醒!這顆是公司拿中國那邊開的來給我,不是stm32,但底是cortex-M0的架構,查了stm32,開機程式真的超像的是否ARM的startup都差不多這樣?會選擇在Reset handler這邊側是改地址是因為我習慣先跑keil的simulator,看他R0這些暫存器行為跟值但常常simulator跑完就直接上機,卻忽略了改這些可能會導致啟動問題,感謝breeze大的說明也感謝descent大,參考網址內資料後,也讓我找到C可以直接用__attribute__((section(.arm.at addres)))來定址
作者: descent (「雄辯是銀,沉默是金」)   2022-01-20 23:23:00
不是, arm 有不同系列,startup 都存在一些差異。
作者: easypro   2022-01-23 19:21:00
大概是仿stm32的mcu吧。如果是仿的就會很像 主要是記憶體起始位置會有差異
作者: sorcerer1973 (sorcerer1973)   2022-04-21 16:50:00
偽指令?不就給編譯器看的,別學好了。

Links booklink

Contact Us: admin [ a t ] ucptt.com