USR_STACK_LEGTHEQU64
SVC_STACK_LEGTHEQU0
FIQ_STACK_LEGTHEQU16
IRQ_STACK_LEGTHEQU64
ABT_STACK_LEGTHEQU0
UND_STACK_LEGTHEQU0
;名稱:InitStack
;功能:堆棧初始化,即初始化各模式下的堆棧指針。
;入口參數(shù):無
;出口參數(shù):無
;說明:在特權(quán)模式下調(diào)用此子程序,比如復(fù)位后的管理模式
InitStack
MOVR0,LR;R0<=LR,因為各種模式下R0是相同
的
;設(shè)置管理模式堆棧
MSRCPSR_c,#0xd3
LDRSP,StackSvc
;設(shè)置中斷模式堆棧
MSRCPSR_c,#0xd2
LDRSP,StackIrq
;設(shè)置快速中斷模式堆棧
MSRCPSR_c,#0xd1
LDRSP,StackFiq
;設(shè)置中止模式堆棧
MSRCPSR_c,#0xd7
LDRSP,StackAbt
;設(shè)置未定義模式堆棧
MSRCPSR_c,#0xdb
LDRSP,StackUnd
;設(shè)置系統(tǒng)模式堆棧
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;用戶(系統(tǒng))模式堆??臻g
SvcStackSpaceSPACESVC_STACK_LEGTH*4;管理模式堆??臻g
IrqStackSpaceSPACEIRQ_STACK_LEGTH*4;中斷模式堆棧空間
FiqStackSpaceSPACEFIQ_STACK_LEGTH*4;快速中斷模式堆??臻g
AbtStackSpaceSPACEABT_STACK_LEGTH*4;中止義模式堆??臻g
UndtStackSpaceSPACEUND_STACK_LEGTH*4;未定義模式堆棧
經(jīng)過ADS1.2仿真;發(fā)現(xiàn)地址變化如下
svc0x400030fc
irq0x400031fc
fiq0x4000323c
abort0x4000323c
undef0x4000323c
sys0x400030fc
svcfirirqabortundefsys的地址是怎樣計算出來的?
本文引用地址:http://m.butianyuan.cn/article/201611/322956.htm- 關(guān)鍵是MyStacks的起始地址.看看ADS的配置里linker選項里的配置. [xiaogang]2007-4-1611:57:05
如果沒有配置.則看AREAMyStacks,DATA,NOINIT,ALIGN=2后面是否有個
^XXXXX..來定義MyStacks的起始地址
得到起始地址后,再由SPACE按順序分配內(nèi)存空間
- 對,RWBase設(shè)置的是0x40003000 [jinjing999666]2007-4-1620:40:08
我又把RWBase設(shè)置的是0x40005000
觀察都變成了
svc0x400050fc
irq0x400051fc
fiq0x4000523c
undef0x4000523c
sys0x400050fc
評論