打印

请教一个ARM启动代码的问题

[复制链接]
2772|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
new1988|  楼主 | 2011-1-9 19:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Vectors         LDR     PC, Reset_Addr         
                LDR     PC, Undef_Addr
                LDR     PC, SWI_Addr
                LDR     PC, PAbt_Addr
                LDR     PC, DAbt_Addr
                NOP                            ; Reserved Vector
;               LDR     PC, IRQ_Addr
                LDR     PC, [PC, #-0x0FF0]     ; Vector from VicVectAddr
                LDR     PC, FIQ_Addr
Reset_Addr      DCD     Reset_Handler
Undef_Addr      DCD     Undef_Handler
SWI_Addr        DCD     SWI_Handler
PAbt_Addr       DCD     PAbt_Handler
DAbt_Addr       DCD     DAbt_Handler
                DCD     0                      ; Reserved Address
IRQ_Addr        DCD     IRQ_Handler
FIQ_Addr        DCD     FIQ_Handler
Undef_Handler   B       Undef_Handler
SWI_Handler     B       SWI_Handler
PAbt_Handler    B       PAbt_Handler
DAbt_Handler    B       DAbt_Handler
IRQ_Handler     B       IRQ_Handler
FIQ_Handler     B       FIQ_Handler
以上是MDK平台自带的LPC21XX的启动代码的一部分。
我想问,为什么LDR  PC,[PC,Reset_Addr]这条指令会放在0x00000000的地址处。
而且Reset_Addr这个标号的值为什么就是0x18。我知道0x18是LPC21XX的向量表。
51单片机的汇编里面有ORG指令,指明一段程序存放的地址。而ARM汇编里面却没有这样的指令。我想知道ARM汇编的指令的存放的地址是由什么指令决定的,还是由编译器决定的。可能是我用51用惯了,一直用51的思维去理解ARM的一些东西。思维一时转不过来,忘大侠指教。

相关帖子

沙发
new1988|  楼主 | 2011-1-9 21:11 | 只看该作者
怎么没人回答啊,是我问的问题弱智,还是怎么滴???

使用特权

评论回复
板凳
shizaigaole| | 2011-1-9 21:54 | 只看该作者
51不是标准,不要那51来比照ARM.

LDR     PC, Reset_Addr这条指令会放在0x00000000的地址处,表明复位就运行这条语句.
PC跳转到Reset_Addr 这个地址里面存储的值所指向的地址来进行初始化.

使用特权

评论回复
地板
new1988|  楼主 | 2011-1-9 22:24 | 只看该作者
3# shizaigaole 我知道每条语句的意思,只是不知道为什么这条语句会放在0x00000000处。难道是一个汇编文件的第一条指令就是放在0x00000000处,那要是多个汇编文件,那哪一条放在0x00000000处啊?

使用特权

评论回复
5
shizaigaole| | 2011-1-9 22:50 | 只看该作者
现在基本不用keil了,不过要是没记错的话,
keil的相关设置里面应该有Vectors 这标号。

使用特权

评论回复
6
shizaigaole| | 2011-1-9 22:59 | 只看该作者
在不用scatter文件的时候,应该是默认Vectors 这标号语句被链接到0x00000000处。

可以启动文件的Vectors 修改为别的单词,

要是不能启动或者是提示链接错误,

说明默认Vectors 这标号语句被链接到0x00000000处。

使用特权

评论回复
7
原野之狼| | 2011-1-10 00:05 | 只看该作者
看看分散加载文件
如果是默认的链接方式 那么也有一个默认的分散加载文件 看看是什么个内容

使用特权

评论回复
8
new1988|  楼主 | 2011-1-10 09:26 | 只看该作者
6# shizaigaole
把Vectors的标号改了也没关系。还是一样的。

使用特权

评论回复
9
new1988|  楼主 | 2011-1-10 09:34 | 只看该作者
7# 原野之狼
看了一下分散加载文件就明白了。
LR_IROM1 0x00000000 0x00008000  {    ; load region size_region
  ER_IROM1 0x00000000 0x00008000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x40000000 0x00002000  {  ; RW data
   .ANY (+RW +ZI)
  }
}
他映射的是RESET这个段名,而不是Vectors这个标号。所以ARM汇编的一段程序或一段数据在存储空间的映射是由分散加载文件决定的是吧?

使用特权

评论回复
10
new1988|  楼主 | 2011-1-10 12:48 | 只看该作者
谢谢各位,我明白了,ARM里面的数据段和代码段在存储器中的映射是有分散加载文件决定的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

470

帖子

0

粉丝