keil MDK初始化堆栈汇编代码分析

Dream_Chaser2015 2016-12-21 07:14:21
__user_setup_stackheap
0x08000590: 4675 uF MOV r5,lr
0x08000592: f7ffffd7 .... BL __user_libspace ; 0x8000544 r0 = 0x20000014(.bss段起始地址 前20Byte为RW数据)
0x08000596: 46ae .F MOV lr,r5 ; 还原lr的值
0x08000598: 0005 .. MOVS r5,r0 ; r5 = 0x20000014
0x0800059a: 4669 iF MOV r1,sp ; sp = 0x20000678 r1 = 0x20000678 ?不确定
0x0800059c: 4653 SF MOV r3,r10 ; r3 = 0x80006AC
0x0800059e: f0200007 ... BIC r0,r0,#7 ; ??
0x080005a2: 4685 .F MOV sp,r0
0x080005a4: b018 .. ADD sp,sp,#0x60
0x080005a6: b520 . PUSH {r5,lr}
0x080005a8: f7fffe00 .... BL __user_initial_stackheap ; 0x80001ac r0 = 0x20000078, r1 = 0x20000678, r2 = 0x20000278, r3 = 0x20000278
0x080005ac: e8bd4020 .. @ POP {r5,lr}
0x080005b0: f04f0600 O... MOV r6,#0
0x080005b4: f04f0700 O... MOV r7,#0
0x080005b8: f04f0800 O... MOV r8,#0
0x080005bc: f04f0b00 O... MOV r11,#0
0x080005c0: f0210107 !... BIC r1,r1,#7
0x080005c4: 46ac .F MOV r12,r5
0x080005c6: e8ac09c0 .... STM r12!,{r6-r8,r11}
0x080005ca: e8ac09c0 .... STM r12!,{r6-r8,r11}
0x080005ce: e8ac09c0 .... STM r12!,{r6-r8,r11}
0x080005d2: e8ac09c0 .... STM r12!,{r6-r8,r11}
0x080005d6: 468d .F MOV sp,r1
0x080005d8: 4770 pG BX lr

上面是MDK编译之后反汇编的代码,初始化堆栈部分。
不明白地址0x0800059e处的指令,为什么要这么做?初始化堆栈要执行什么操作?不是只需要给出SP的值,堆的起始地址和堆 的大小就可以吗?
希望大神指点一下这段代码的作用
...全文
1623 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧