ARM启动代码疑惑!

[复制链接]
2750|7
 楼主| areshan 发表于 2010-12-10 11:59 | 显示全部楼层 |阅读模式
; User Initial Stack & Heap
                AREA    |.text|, CODE, READONLY
                IMPORT  __use_two_region_memory
                EXPORT  __user_initial_stackheap
__user_initial_stackheap
                LDR     R0, =  Heap_Mem
                LDR     R1, =(Stack_Mem + USR_Stack_Size)
                LDR     R2, = (Heap_Mem +      Heap_Size)
                LDR     R3, = Stack_Mem
                BX      LR
                ENDIF

                END
上面是用户初始化堆和栈的代码,有点看不同,这段段代码是在B _main之后,在c的后面,不过在单步调试时,可以看到C中的main函数后面编译器给自动加上有些其他的代码,不知道上面的代码是在什么时候被执行,还有给R0,R1,R2,R3堆和栈的地址有什么用呢??????
xinzha 发表于 2010-12-10 15:55 | 显示全部楼层
供ARM本身提供的库函数调用,做堆栈的初始化等工作,至于寄存器赋值那就是一套完整的ARM规则了,ATPCS
 楼主| areshan 发表于 2010-12-10 16:21 | 显示全部楼层
我想知道堆栈的初始话都做了些什么!!!!!!!堆和栈的大小,地址在配置中都有了,初始化是给他么空间清0??????ro,r1,r2,r3,是atpcs的规则:函数用ro,r1,r2,r3传递参数,如果参数大于4个要用栈来传递!
谢谢你的回复!!!!!!
xinzha 发表于 2010-12-11 08:26 | 显示全部楼层
你知道了cpu并不一定知道,而且堆是一个概念,需要软件来维护。清零是必须的。
senioryzc 发表于 2010-12-11 11:55 | 显示全部楼层
c库里面有个malloc函数,当你的代码调用他的时候,他去哪里分配内置呢
显然必须在系统初始化的时候,你告诉它一块内存
stack同样的道理,你的C函数要运行,必须要有个栈,也是你必须告诉它的

如果你在用单步,那么B _main之后每步都单步,你就能找到调用的地方
armmage 发表于 2010-12-12 19:33 | 显示全部楼层
你用的是LPC的ARM吧  我还是喜欢三星的ARM启动代码 少用那些库函数 自己搞初始化
 楼主| areshan 发表于 2010-12-13 08:26 | 显示全部楼层
谢谢上面的回复!
20070936 发表于 2010-12-14 11:05 | 显示全部楼层
堆栈的作用
   在ARM处理器中通常将R13作为堆栈寄存器(SP),用于保存堆栈的出入口地址。ARM一共有6个堆栈寄存器,其中用户模式和系统模式共用一个,每种异常模式都有专门的寄存器。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

127

主题

728

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部