各位老大 小弟我不太会用汇编 请多多指教 谢谢<br />init.s<br /> GET memory.a<br /> GET snds.a<br /><br /> AREA Init, CODE, READONLY<br /><br />; --- Define entry point<br /> EXPORT __main ; defined to ensure that C runtime system<br />__main ; is not linked in<br /> ENTRY<br />; --- Setup interrupt / exception vectors<br /> IF :DEF: ROM_AT_ADDRESS_ZERO<br />; If the ROM is at address 0 this is just a sequence of branches<br /> B Reset_Handler<br /> B Undefined_Handler<br /> B SWI_Handler<br /> B Prefetch_Handler<br /> B Abort_Handler<br /> NOP ; Reserved vector<br /> B IRQ_Handler<br /> B FIQ_Handler<br /> ELSE<br />; Otherwise we copy a sequence of LDR PC instructions over the vectors<br />; (Note: We copy LDR PC instructions because branch instructions<br />; could not simply be copied, the offset in the branch instruction<br />; would have to be modified so that it branched into ROM. Also, a<br />; branch instructions might not reach if the ROM is at an address<br />; > 32M).<br /> MOV R8, #0<br /> ADR R9, Vector_Init_Block<br /> LDMIA R9!, {R0-R7}<br /> STMIA R8!, {R0-R7}<br /> LDMIA R9!, {R0-R7}<br /> STMIA R8!, {R0-R7}<br /><br />; Now fall into the LDR PC, Reset_Addr instruction which will continue<br />; execution at 'Reset_Handler'<br /><br />Vector_Init_Block<br /> LDR PC, Reset_Addr<br /> LDR PC, Undefined_Addr<br /> LDR PC, SWI_Addr<br /> LDR PC, Prefetch_Addr<br /> LDR PC, Abort_Addr<br /> NOP<br /> LDR PC, IRQ_Addr<br /> LDR PC, FIQ_Addr<br /><br />Reset_Addr DCD Reset_Handler<br />Undefined_Addr DCD Undefined_Handler<br />SWI_Addr DCD SWI_Handler<br />Prefetch_Addr DCD Prefetch_Handler<br />Abort_Addr DCD Abort_Handler<br /> DCD 0 ; Reserved vector<br />IRQ_Addr DCD IRQ_Handler<br />FIQ_Addr DCD FIQ_Handler<br /> ENDIF<br /><br />;==========================================================<br />; The Default Exception Handler Vector Entry Pointer Setup<br />;==========================================================<br />FIQ_Handler<br /> SUB sp, sp, #4<br /> STMFD sp!, {r0}<br /> LDR r0, =HandleFiq<br /> LDR r0, [r0]<br /> STR r0, [sp, #4]<br /> LDMFD sp!, {r0, pc}<br /><br />IRQ_Handler<br /> SUB sp, sp, #4<br /> STMFD sp!, {r0}<br /> LDR r0, =HandleIrq<br /> LDR r0, [r0]<br /> STR r0, [sp, #4]<br /> LDMFD sp!, {r0, pc}<br /><br />Prefetch_Handler<br /> SUB sp, sp, #4<br /> STMFD sp!, {r0}<br /> LDR r0, =HandlePrefetch<br /> LDR r0, [r0]<br /> STR r0, [sp, #4]<br /> LDMFD sp!, {r0, pc}<br /><br />Abort_Handler<br /> SUB sp, sp, #4<br /> STMFD sp!, {r0}<br /> LDR r0, =HandleAbort<br /> LDR r0, [r0]<br /> STR r0, [sp, #4]<br /> LDMFD sp!, {r0, pc}<br /><br />Undefined_Handler<br /> SUB sp, sp, #4<br /> STMFD sp!, {r0}<br /> LDR r0, =HandleUndef<br /> LDR r0, [r0]<br /> STR r0, [sp, #4]<br /> LDMFD sp!, {r0, pc}<br /><br />SWI_Handler<br /> SUB sp, sp, #4<br /> STMFD sp!, {r0}<br /> LDR r0, =HandleSwi<br /> LDR r0, [r0]<br /> STR r0, [sp, #4]<br /> LDMFD sp!, {r0, pc}<br /><br /> AREA Main, CODE, READONLY<br /><br />;==========================================================<br />; The Reset Entry Point<br />;==========================================================<br /> EXPORT Reset_Handler<br />Reset_Handler ;/* Reset Entry Point */<br /><br /> LDR r1, =IntMask<br /> LDR r0, =0xFFFFFFFF<br /> STR r0, [r1]<br /><br />[ ROM_AT_ADDRESS_ZERO /*151行错误*/<br /> <br /> LDR r0, =HandleSwi ; SWI exception table address<br /> LDR r1, =SystemSwiHandler<br /> STR r1, ][r0]<br /> swi 0xff ;/* Call SWI Vector */<br /><br />]<br /> |
|