85: Vectors LDR PC, Reset_Addr ;加载Reset_Addr到寄存器PC中 <br />0x00000000 E59FF018 LDR PC,[PC,#0x0018] ;这里是将PC+0x0018地址处的数据读出保存到PC,一开始PC=0,那么PC+0x0018后就是0x0018,就是说完成这语句后,程序要跳到0x0018该地址了,但是从LDR PC, Reset_Addr 来看,是要跳到Reset_Addr该地址处(0x00000020 00000058 DD 0x00000058).那这样不是错了吗? <br /> 86: LDR PC, Undef_Addr <br />0x00000004 E59FF018 LDR PC,[PC,#0x0018]<br /> 87: LDR PC, SWI_Addr <br />0x00000008 E59FF018 LDR PC,[PC,#0x0018]<br /> 88: LDR PC, PAbt_Addr <br />0x0000000C E59FF018 LDR PC,[PC,#0x0018]<br /> 89: LDR PC, DAbt_Addr <br />0x00000010 E59FF018 LDR PC,[PC,#0x0018]<br /> 90: NOP ; Reserved Vector <br /> 91: ; LDR PC, IRQ_Addr <br />0x00000014 E1A00000 NOP <br /> 92: LDR PC, [PC, #-0x0120] ; Vector from VicVectAddr <br />0x00000018 E51FF120 LDR PC,[PC,#-0x0120]<br /> 93: LDR PC, FIQ_Addr <br /> 94: <br /> 95: Reset_Addr DCD Reset_Handler ;将Reset_Handler加载到当前地址Reset_Addr上 <br /> 96: Undef_Addr DCD Undef_Handler <br /> 97: SWI_Addr DCD SWI_Handler <br /> 98: PAbt_Addr DCD PAbt_Handler <br /> 99: DAbt_Addr DCD DAbt_Handler <br /> 100: DCD 0xB9206E28 ; Reserved Address <br /> 101: IRQ_Addr DCD IRQ_Handler <br /> 102: FIQ_Addr DCD FIQ_Handler <br /> 103: <br />0x0000001C E59FF018 LDR PC,[PC,#0x0018]<br />0x00000020 00000058 DD 0x00000058<br />0x00000024 00000040 DD 0x00000040<br />0x00000028 00000044 DD 0x00000044<br />0x0000002C 00000048 DD 0x00000048<br />0x00000030 0000004C DD 0x0000004C<br />0x00000034 B9206E28 DD 0xB9206E28<br />0x00000038 00000050 DD 0x00000050<br />0x0000003C 00000054 DD 0x00000054<br /> 104: Undef_Handler B Undef_Handler <br />0x00000040 EAFFFFFE B 0x00000040<br /> 105: SWI_Handler B SWI_Handler <br />0x00000044 EAFFFFFE B 0x00000044<br /> 106: PAbt_Handler B PAbt_Handler <br />0x00000048 EAFFFFFE B 0x00000048<br /> 107: DAbt_Handler B DAbt_Handler <br />0x0000004C EAFFFFFE B 0x0000004C<br /> 108: IRQ_Handler B IRQ_Handler <br />0x00000050 EAFFFFFE B 0x00000050<br /> 109: FIQ_Handler B FIQ_Handler <br /> 110: <br /> 111: ; Reset Handler <br /> 112: <br /> 113: EXPORT Reset_Handler <br /> 114: Reset_Handler <br /> 115: <br /> 116: ; Setup Stack for each mode <br />0x00000054 EAFFFFFE B 0x00000054<br /> 117: LDR R0, =Stack_Top <br /> 118: <br /> 119: ; Enter Undefined Instruction Mode and set its Stack Pointer <br />0x00000058 E59F0050 LDR R0,[PC,#0x0050]<br /> 120: MSR CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit ; :OR: Mode_UND,I_Bit,F_Bit之间按位作逻辑或操作,设置未定义模式,禁止FIQ,IRQ <br />0x0000005C E321F0DB MSR CPSR_c,#0x000000DB<br /> 121: MOV SP, R0 ;堆指针指向栈顶 <br />0x00000060 E1A0D000 MOV R13,R0<br /> 122: SUB R0, R0, #UND_Stack_Size ;把减去"未定义模式的栈"大小后的地址存放在R0(那么从开始的栈顶到该地址之间的大小为未定义模式分配的栈的大小),R0只是一个存放东西的容器,它会随着存放内容同而更新自己的值 <br /> 123: <br /> 124: ; Enter Abort Mode and set its Stack Pointer <br />0x00000064 E2400000 SUB R0,R0,#0x00000000<br /> 125: MSR CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit <br />0x00000068 E321F0D7 MSR CPSR_c,#0x000000D7<br /> 126: MOV SP, R0 ;ABT模式的栈指针指向R0中存放的地址 <br />0x0000006C E1A0D000 MOV R13,R0<br /> 127: SUB R0, R0, #ABT_Stack_Size ;分配ABT模式的栈大小, <br /> 128: <br /> 129: ; Enter FIQ Mode and set its Stack Pointer <br />0x00000070 E2400000 SUB R0,R0,#0x00000000<br /> 130: MSR CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit <br />0x00000074 E321F0D1 MSR CPSR_c,#0x000000D1<br /> 131: MOV SP, R0 <br />0x00000078 E1A0D000 MOV R13,R0<br /> 132: SUB R0, R0, #FIQ_Stack_Size <br /> 133: <br /> 134: ; Enter IRQ Mode and set its Stack Pointer <br />0x0000007C E2400000 SUB R0,R0,#0x00000000<br /> 135: MSR CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit <br />0x00000080 E321F0D2 MSR CPSR_c,#0x000000D2<br /> 136: MOV SP, R0 <br />0x00000084 E1A0D000 MOV R13,R0<br /> 137: SUB R0, R0, #IRQ_Stack_Size <br /> 138: <br /> 139: ; Enter Supervisor Mode and set its Stack Pointer <br />0x00000088 E2400C01 SUB R0,R0,#0x00000100<br /> 140: MSR CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit <br />0x0000008C E321F0D3 MSR CPSR_c,#0x000000D3<br /> 141: MOV SP, R0 <br />0x00000090 E1A0D000 MOV R13,R0<br /> 142: SUB R0, R0, #SVC_Stack_Size ;分配管理模式堆栈的大小,R0现在存储着该堆栈的最底下地址(栈底) <br /> 143: <br /> 144: ; Enter User Mode and set its Stack Pointer <br />0x00000094 E2400C01 SUB R0,R0,#0x00000100<br /> 145: MSR CPSR_c, #Mode_USR <br />0x00000098 E321F010 MSR CPSR_c,#0x00000010<br /> 146: MOV SP, R0 <br />0x0000009C E1A0D000 MOV R13,R0<br /> 147: SUB SL, SP, #USR_Stack_Size ;到这里,所有模式的堆栈已经分配好,SL存储着用户模式堆栈的最底下地址(栈底) <br /> |
|