USR_STACK_LEGTHEQU64
SVC_STACK_LEGTHEQU0
FIQ_STACK_LEGTHEQU16
IRQ_STACK_LEGTHEQU64
ABT_STACK_LEGTHEQU0
UND_STACK_LEGTHEQU0
;名称:InitStack
;功能:堆栈初始化,即初始化各模式下的堆栈指针。
;入口参数:无
;出口参数:无
;说明:在特权模式下调用此子程序,比如复位后的管理模式
InitStack
MOVR0,LR;R0<=LR,因为各种模式下R0是相同
的
;设置管理模式堆栈
MSRCPSR_c,#0xd3
LDRSP,StackSvc
;设置中断模式堆栈
MSRCPSR_c,#0xd2
LDRSP,StackIrq
;设置快速中断模式堆栈
MSRCPSR_c,#0xd1
LDRSP,StackFiq
;设置中止模式堆栈
MSRCPSR_c,#0xd7
LDRSP,StackAbt
;设置未定义模式堆栈
MSRCPSR_c,#0xdb
LDRSP,StackUnd
;设置系统模式堆栈
MSRCPSR_c,#0xdf
LDRSP,StackUsr
MOVPC,R0
StackUsrDCDUsrStackSpace+(USR_STACK_LEGTH-1)*4
StackSvcDCDSvcStackSpace+(SVC_STACK_LEGTH-1)*4
StackIrqDCDIrqStackSpace+(IRQ_STACK_LEGTH-1)*4
StackFiqDCDFiqStackSpace+(FIQ_STACK_LEGTH-1)*4
StackAbtDCDAbtStackSpace+(ABT_STACK_LEGTH-1)*4
StackUndDCDUndtStackSpace+(UND_STACK_LEGTH-1)*4
;分配堆栈空间
AREAMyStacks,DATA,NOINIT,ALIGN=2
UsrStackSpaceSPACEUSR_STACK_LEGTH*4;用户(系统)模式堆栈空间
SvcStackSpaceSPACESVC_STACK_LEGTH*4;管理模式堆栈空间
IrqStackSpaceSPACEIRQ_STACK_LEGTH*4;中断模式堆栈空间
FiqStackSpaceSPACEFIQ_STACK_LEGTH*4;快速中断模式堆栈空间
AbtStackSpaceSPACEABT_STACK_LEGTH*4;中止义模式堆栈空间
UndtStackSpaceSPACEUND_STACK_LEGTH*4;未定义模式堆栈
经过ADS1.2仿真;发现地址变化如下
svc0x400030fc
irq0x400031fc
fiq0x4000323c
abort0x4000323c
undef0x4000323c
sys0x400030fc
svcfirirqabortundefsys的地址是怎样计算出来的?
本文引用地址:https://www.eepw.com.cn/article/201611/322956.htm- 关键是MyStacks的起始地址.看看ADS的配置里linker选项里的配置. [xiaogang]2007-4-1611:57:05
如果没有配置.则看AREAMyStacks,DATA,NOINIT,ALIGN=2后面是否有个
^XXXXX..来定义MyStacks的起始地址
得到起始地址后,再由SPACE按顺序分配内存空间
- 对,RWBase设置的是0x40003000 [jinjing999666]2007-4-1620:40:08
我又把RWBase设置的是0x40005000
观察都变成了
svc0x400050fc
irq0x400051fc
fiq0x4000523c
undef0x4000523c
sys0x400050fc
评论