STM32启动代码分析问题
来源:互联网 发布:恶魔奶爸sam 与知乎 编辑:程序博客网 时间:2024/04/28 04:27
能否讲解一下startup_stm32f10x_cl.s启动代码含义,谢谢!
我现在看反汇编如下
0x08000000 0678 LSLS r0,r7,#25 (查看Memory窗口0x08000000 : 78 06 00 20 ---STM32小端缘故)
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?
解答:
cortex-M3和ARM9的架构有很大区别,ARM7、ARM9在复位后是从地址0处开始执行指令,也就是说地址0x00000000的内容是指令。而cortex-M3的异常向量表中的内容并不是指令,0x00000000处(当然也可能映射到别的范围)是主堆栈指针的数值,0x00000004的内容是复位后需要跳转到的地址,是一个地址而不是一条指令。
stm32选择flash启动方式,中断向量表映射到0x08000000,由楼主给出的反汇编可知,复位后主堆栈指针的位置是0x20000678,0x08000004位置的数值是0x08001105,由于cortex-M3只能运行在thumb2状态,所以要保证向PC(R15)写入的数值的bit0必须是1(如果向PC写入的数值的bit0是0,则处理器认为试图切入ARM状态,会产生fault),而实际上stm32的指令是半字对齐的,所以复位后会跳转到0x08001104.
- STM32启动代码分析问题
- stm32启动代码分析
- stm32启动代码分析
- STM32启动代码分析
- STM32启动代码分析
- STM32 启动代码分析
- stm32启动代码分析
- STM32 启动代码发分析
- STM32 keil mdk启动代码发分析
- STM32 keil mdk启动代码发分析
- STM32 keil mdk启动代码发分析
- STM32 keil mdk启动代码发分析
- STM32 keil mdk启动代码发分析
- STM32与ARM启动代码比较分析
- STM32 keil mdk启动代码发分析 .
- STM32启动代码分析_01[转]
- stm32启动代码分析_02[转]
- STM32 keil mdk启动代码发分析 .
- 输入10个数到数组,输出最大值
- 最近心情很不好
- 如何去掉Joomla! 是基于GNU通用公共授权而发布的自由软件
- 1 关于数据仓库维度数据处理的方法探究系列——维的概述
- Oracle Sql Developer 使用技巧
- STM32启动代码分析问题
- uC/OS-II中的全局变量声明
- Oracle中使用PL/SQL得到服务器和客户端的IP
- 获取真实IP和代理IP (asp.net C#)
- 解读Google analytics的代码 让你充分DIY
- 吉比特-笔试
- 打开新页面
- 开机时agntsrvc.exe出错
- spring 构造注入方式,以及Ajax初接触