打印

请教大侠--STM32启动代码分析

[复制链接]
7187|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zyboy|  楼主 | 2009-10-12 14:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
能否讲解一下startup_stm32f10x_cl.s启动代码含义,谢谢!

我现在看反汇编如下
0x08000000 0678      LSLS     r0,r7,#25
0x08000002 2000      MOVS     r0,#0x00
0x08000004 1105      ASRS     r5,r0,#408
0x08000006 0800      LSRS     r0,r0,#00A
。。。。。。。。。。。。。。。。。。。。。。

上面应该对应
__Vectors       DCD     __initial_sp              ; Top of Stack
                DCD     Reset_Handler             ; Reset Handler
                DCD     NMI_Handler               ; NMI Handler
                DCD     HardFault_Handler         ; Hard Fault Handler
                DCD     MemManage_Handler         ; MPU Fault Handler
                DCD     BusFault_Handler          ; Bus Fault Handler
                DCD     UsageFault_Handler        ; Usage Fault Handler



0x08001104 4808      LDR      r0,[pc,#32]  ;  程序一运行跳到这里,why?
0x08001106 4700      BX       r0,r0,#0

上面对应
Reset_Handler    PROC
                 EXPORT  Reset_Handler             [WEAK]
        IMPORT  __main
                 LDR     R0, =__main
                 BX      R0
                 ENDP

那位能说一下为什么跳到0x08001104,即PC =0x08001104, 我想应该PC应该先跳到0x08000000?

我搞ARM9的时候汇编开头一般都是
0x00000000  E59FF018  LDR       PC,[PC,#0x0018]
0x00000004  E59FF018  LDR       PC,[PC,#0x0018]
0x00000008  E59FF018  LDR       PC,[PC,#0x0018]
0x0000000C  E59FF018  LDR       PC,[PC,#0x0018]
0x00000010  E59FF018  LDR       PC,[PC,#0x0018]
0x00000014  E1A00000  NOP      
0x00000018  E59FF018  LDR       PC,[PC,#0x0018]
0x0000001C  E59FF018  LDR       PC,[PC,#0x0018]

这样很好理解为什么跳到后面去?请哪位大侠说一下,谢谢!
沙发
arm_fan168| | 2009-10-12 15:14 | 只看该作者
cortex-M3和ARM9的架构有很大区别,ARM7、ARM9在复位后是从地址0处开始执行指令,也就是说地址0x00000000的内容是指令。而cortex-M3的异常向量表中的内容并不是指令,0x00000000处(当然也可能映射到别的范围)是主堆栈指针的数值,0x00000004的内容是复位后需要跳转到的地址,是一个地址而不是一条指令。

使用特权

评论回复
板凳
arm_fan168| | 2009-10-12 15:36 | 只看该作者
stm32选择flash启动方式,中断向量表映射到0x08000000,由楼主给出的反汇编可知,复位后主堆栈指针的位置是0x20000678,0x08000004位置的数值是0x08001105,由于cortex-M3只能运行在thumb2状态,所以要保证向PC(R15)写入的数值的bit0必须是1(如果向PC写入的数值的bit0是0,则处理器认为试图切入ARM状态,会产生fault),而实际上stm32的指令是半字对齐的,所以复位后会跳转到0x08001104.

使用特权

评论回复
地板
zyboy|  楼主 | 2009-10-12 17:09 | 只看该作者
复位后需要跳转到的地址,是一个地址而不是一条指令。这句话太关键了!

哈哈,谢谢了,我只匆匆看了Cortex-m3内核,就记得中断向量表SP后面才是复位,却潜意识认为里面是跳转指令
受其他ARM,单片机毒害太深,总记得是中断向量表是一个长跳转指针,惭愧

使用特权

评论回复
5
香水城| | 2009-10-12 17:13 | 只看该作者
嘿嘿,“中断向量表”,按字面理解,只包含向量而不包含指令,:lol

使用特权

评论回复
6
daipan| | 2009-12-28 14:13 | 只看该作者
强人,也解决我的相同困惑,谢谢了!

使用特权

评论回复
7
lord_fan| | 2011-9-28 17:07 | 只看该作者
stm32选择flash启动方式,中断向量表映射到0x08000000,由楼主给出的反汇编可知,复位后主堆栈指针的位置是0x20000678,0x08000004位置的数值是0x08001105,由于cortex-M3只能运行在thumb2状态,所以要保证向PC(R15 ...
arm_fan168 发表于 2009-10-12 15:36

:hug:

使用特权

评论回复
8
woyaochenggong| | 2011-9-29 08:32 | 只看该作者
复位后需要跳转到的地址,是一个地址而不是一条指令!!!

使用特权

评论回复
9
efen| | 2012-9-14 17:41 | 只看该作者
mark

使用特权

评论回复
10
zqh1630| | 2012-10-16 15:37 | 只看该作者
1# zyboy
mark,好贴啊!!

使用特权

评论回复
11
weikezhi| | 2012-10-21 12:24 | 只看该作者
长见识了

使用特权

评论回复
12
weikezhi| | 2012-10-21 12:24 | 只看该作者
长见识了

使用特权

评论回复
13
拿起书本| | 2012-10-21 15:53 | 只看该作者
mark一下,刚好我也要弄,要是有进展,再来回贴

使用特权

评论回复
14
yhn1973| | 2012-10-21 19:24 | 只看该作者
哪里能搞到cortex-M3的反汇编软件?

使用特权

评论回复
15
wwomee| | 2012-12-22 11:35 | 只看该作者
MDK进入DEBUG模式可以看到

使用特权

评论回复
16
申小林一号| | 2012-12-24 05:41 | 只看该作者
上面的对话给我很多启示!!!!谢谢各位坛友啊!!

使用特权

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

本版积分规则

101

主题

356

帖子

0

粉丝