打印

求助,有个arm问题不解

[复制链接]
1473|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
vipchenvip|  楼主 | 2012-1-24 21:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在用MDK调试lpc系列arm处理器的时候,用软件复位后,芯片进入管理模式,然后执行启动代码,为什么跳到main函数以后变成了用户模式,他是怎么变的,根据什么,在哪里变的

相关帖子

沙发
vipchenvip|  楼主 | 2012-1-25 15:04 | 只看该作者
ps:启动代码是mdk自带的lpc2000系列的startup.s

使用特权

评论回复
板凳
xinzha| | 2012-1-26 20:35 | 只看该作者
所有用汇编语句操作cpsr的地方都可以变换模式,如果调用了arm提供的库函数__main,从startup.s到main中间会有一段代码是你不可控的,也有可能在那里修改。

使用特权

评论回复
地板
vipchenvip|  楼主 | 2012-1-26 22:05 | 只看该作者
3# xinzha
多谢我知道了,应该是这一句
                MSR     CPSR_c, #Mode_USR
                MOV     SP, R0
                SUB     SL, SP, #USR_Stack_Size

使用特权

评论回复
5
vipchenvip|  楼主 | 2012-1-26 22:18 | 只看该作者
Startup.rar (3.25 KB) 4# vipchenvip
关于启动代码我还有些问题想向您请教

使用特权

评论回复
6
vipchenvip|  楼主 | 2012-1-26 22:49 | 只看该作者
3# xinzha
关于startup.s我还有些问题想向您请教,代码在五楼
1 LINE67    AREA    STACK, NOINIT, READWRITE, ALIGN=3
                     Stack_Mem       SPACE   Stack_Size
这句是分配栈空间,这只是一个偏移量,请问具体的起始位置在哪里,是如何确定的,是连接器自动分配的吗

2 LINE57   UND_Stack_Size  EQU     0x00000000
                SVC_Stack_Size  EQU     0x00000008
                ABT_Stack_Size  EQU     0x00000000
                FIQ_Stack_Size  EQU     0x00000000
                IRQ_Stack_Size  EQU     0x00000080
                USR_Stack_Size  EQU     0x00000400
为什么未定义模式,中止模式,快速中断模式的栈大小都是0

3 LINE232 Vectors          LDR     PC, Reset_Addr         
                                    LDR     PC, Undef_Addr
                                    LDR     PC, SWI_Addr
                                    LDR     PC, PAbt_Addr
                                    LDR     PC, DAbt_Addr
为什么这几句是从绝度地址零开始的,这是由什么决定的,是不是由于LINE224的ARM,怎么没见过这样的伪指令,等同于ENTRY吗

使用特权

评论回复
7
xinzha| | 2012-1-27 12:15 | 只看该作者
是链接器根据分散加载描述文件来决定的,如果没有指定分散加载描述文件,链接器就采用菜单链接模式,默认entry为0地址,其他部分按照默认规则顺序分配。
在arm7中没有快中断,所以快中断的栈大小为0,不实现指令扩展和虚拟地址之类的功能,进入未定义模式和中止模式就是有了不可容忍的错误,没必要处理,所以栈大小为0。

使用特权

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

本版积分规则

1

主题

65

帖子

1

粉丝