[问题]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