- 积分
- 0
贡献0
飞刀0 FD
注册时间2016-1-4
在线时间0 小时
|
楼主 |
发表于 2011-8-18 16:52:34
|
显示全部楼层
本帖最后由 潇毅 于 2011-8-18 16:54 编辑
回复 2# 飞凌-fatfish
谢谢,还有一个问题。就是下面关于CPSR状态寄存器的初始化。- ;/*************************************************************************************
- ; File Name : retarget_.s
- ;
- ; File Description : This file implements the stack & heap initilaization
- ;*************************************************************************************/
- GET ..\inc\option.inc
-
- AREA |C$$code|, CODE, READONLY
- Mode_USR EQU 0x10 ;用户模式
- Mode_FIQ EQU 0x11 ;快速中断模式
- Mode_IRQ EQU 0x12 ;中断请求模式
- Mode_SVC EQU 0x13 ;管理模式
- Mode_ABT EQU 0x17 ;异常中断模式
- Mode_UND EQU 0x1b ;未定义模式
- Mode_SYS EQU 0x1f ;系统模式
- I_Bit EQU 0x80 ;禁止IRQ中断
- F_Bit EQU 0x40 ;禁止FRQ中断
- ;定义中断堆栈空间大小
- Size_FIQ_Stack EQU 256
- Size_IRQ_Stack EQU 256
- Size_ABT_Stack EQU 256
- Size_UND_Stack EQU 256
- Size_SVC_Stack EQU 8192
- ;定义堆栈偏移量
- Offset_FIQ_Stack EQU 0
- Offset_IRQ_Stack EQU Offset_FIQ_Stack + Size_FIQ_Stack
- Offset_ABT_Stack EQU Offset_IRQ_Stack + Size_IRQ_Stack
- Offset_UND_Stack EQU Offset_ABT_Stack + Size_ABT_Stack
- Offset_SVC_Stack EQU Offset_UND_Stack + Size_UND_Stack
- EXPORT __user_initial_stackheap
- __user_initial_stackheap ;初始化堆栈
- ldr r0,=top_of_stacks ;将栈顶的地址赋给r0
- msr CPSR_c,#Mode_FIQ:OR:I_Bit:OR:F_Bit
- sub sp,r0,#Offset_FIQ_Stack
- msr CPSR_c,#Mode_IRQ:OR:I_Bit:OR:F_Bit
- sub sp,r0,#Offset_IRQ_Stack
- msr CPSR_c,#Mode_ABT:OR:I_Bit:OR:F_Bit
- sub sp,r0,#Offset_ABT_Stack
- msr CPSR_c,#Mode_UND:OR:I_Bit:OR:F_Bit
- sub sp,r0,#Offset_UND_Stack
- msr CPSR_c,#Mode_SVC:OR:I_Bit:OR:F_Bit
- sub sp,r0,#Offset_SVC_Stack
-
- ;IMPORT |Image$$ZI$$Limit| ;表示ZI的结束地址
- ;LDR r0, =|Image$$ZI$$Limit|
- ldr r0, =base_of_heap
- mov r2,#0
- mov r3,#0
- mov pc,lr ;R14的值复制到PC,子程序返回
- ;-------------------------------------------------------
- [ (VIC_MODE = 0) ;VIC_MODE预定义为1,跳过该段程序
- IMPORT IntHandlerTable
- EXPORT IsrIRQ
- IsrIRQ
- sub sp,sp,#4 ; reserved for PC
- stmfd sp!,{r8-r9}
- ldr r9,=0x71200f00 ; rVIC0ADDR
- ldr r9,[r9]
- ldr r8,=IntHandlerTable
- add r8,r8,r9,lsl #2 ;r8=r8+r9*4
- ldr r8,[r8]
- str r8,[sp,#8]
- ldmfd sp!,{r8-r9,pc}
- ]
- LTORG ;数据缓冲池伪指令
-
- END
复制代码 我有个地方搞不懂,就是__user_initial_stackheap 这个汇编函数- __user_initial_stackheap ;初始化堆栈
- ldr r0,=top_of_stacks ;将栈顶的地址赋给r0
- msr CPSR_c,#Mode_FIQ:OR:I_Bit:OR:F_Bit
- sub sp,r0,#Offset_FIQ_Stack
- msr CPSR_c,#Mode_IRQ:OR:I_Bit:OR:F_Bit
- sub sp,r0,#Offset_IRQ_Stack
- msr CPSR_c,#Mode_ABT:OR:I_Bit:OR:F_Bit
- sub sp,r0,#Offset_ABT_Stack
- msr CPSR_c,#Mode_UND:OR:I_Bit:OR:F_Bit
- sub sp,r0,#Offset_UND_Stack
- msr CPSR_c,#Mode_SVC:OR:I_Bit:OR:F_Bit
- sub sp,r0,#Offset_SVC_Stack
-
- ;IMPORT |Image$$ZI$$Limit| ;表示ZI的结束地址
- ;LDR r0, =|Image$$ZI$$Limit|
- ldr r0, =base_of_heap
- mov r2,#0
- mov r3,#0
- mov pc,lr ;R14的值复制到PC,子程序返回
复制代码 比如说:- ldr r0,=top_of_stacks ;将栈顶的地址赋给r0
- msr CPSR_c,#Mode_FIQ:OR:I_Bit:OR:F_Bit
- sub sp,r0,#Offset_FIQ_Stack
复制代码 执行这句话后状态寄存器CPSR的C标志位会有何种变化? |
|