⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 crt0.s

📁 FAT16 Filesystem on Philips LPC2000 series processors
💻 S
字号:
        .global main                    // int main(void)        .global _etext                  // -> .data initial values in ROM        .global _data                   // -> .data area in RAM        .global _edata                  // end of .data area        .global __bss_start             // -> .bss area in RAM        .global __bss_end__             // end of .bss area        .global _stack                  // top of stack// Stack Sizes        .set  UND_STACK_SIZE, 0x00000004        .set  ABT_STACK_SIZE, 0x00000004        .set  FIQ_STACK_SIZE, 0x00000004        .set  IRQ_STACK_SIZE, 0X00000080        .set  SVC_STACK_SIZE, 0x00000004// Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs        .set  MODE_USR, 0x10            // User Mode        .set  MODE_FIQ, 0x11            // FIQ Mode        .set  MODE_IRQ, 0x12            // IRQ Mode        .set  MODE_SVC, 0x13            // Supervisor Mode        .set  MODE_ABT, 0x17            // Abort Mode        .set  MODE_UND, 0x1B            // Undefined Mode        .set  MODE_SYS, 0x1F            // System Mode        .equ  I_BIT, 0x80               // when I bit is set, IRQ is disabled        .equ  F_BIT, 0x40               // when F bit is set, FIQ is disabled        .text        .code 32        .align 2        .global _boot        .func   _boot_boot:// Runtime Interrupt Vectors// -------------------------Vectors:        b     _start                    // reset - _start        ldr   pc,_undf                  // undefined - _undf        ldr   pc,_swi                   // SWI - _swi        ldr   pc,_pabt                  // program abort - _pabt        ldr   pc,_dabt                  // data abort - _dabt        nop                             // reserved        ldr   pc,[pc,#-0xFF0]           // IRQ - read the VIC        ldr   pc,_fiq                   // FIQ - _fiq#if 0// Use this group for production_undf:  .word _reset                    // undefined - _reset_swi:   .word _reset                    // SWI - _reset_pabt:  .word _reset                    // program abort - _reset_dabt:  .word _reset                    // data abort - _reset_irq:   .word _reset                    // IRQ - _reset_fiq:   .word _reset                    // FIQ - _reset#else// Use this group for development_undf:  .word __undf                    // undefined_swi:   .word __swi                     // SWI_pabt:  .word __pabt                    // program abort_dabt:  .word __dabt                    // data abort_irq:   .word __irq                     // IRQ_fiq:   .word __fiq                     // FIQ__undf: b     .                         // undefined__swi:  b     .                         // SWI__pabt: b     .                         // program abort__dabt: b     .                         // data abort__irq:  b     .                         // IRQ__fiq:  b     .                         // FIQ#endifJTAG2:	.word	0x55400000PINSELREG:	.word	0xe002c004        .size _boot, . - _boot        .endfunc// Setup the operating mode & stack.// ---------------------------------        .global _start, start, _mainCRTStartup        .func   _start_start:start:_mainCRTStartup:// Initialize Interrupt System// - Set stack location for each mode// - Leave in System Mode with Interrupts Disabled// -----------------------------------------------;        ldr   r0,=_stack        msr   CPSR_c,#MODE_UND|I_BIT|F_BIT // Undefined Instruction Mode        mov   sp,r0        sub   r0,r0,#UND_STACK_SIZE        msr   CPSR_c,#MODE_ABT|I_BIT|F_BIT // Abort Mode        mov   sp,r0        sub   r0,r0,#ABT_STACK_SIZE        msr   CPSR_c,#MODE_FIQ|I_BIT|F_BIT // FIQ Mode        mov   sp,r0        sub   r0,r0,#FIQ_STACK_SIZE        msr   CPSR_c,#MODE_IRQ|I_BIT|F_BIT // IRQ Mode        mov   sp,r0        sub   r0,r0,#IRQ_STACK_SIZE        msr   CPSR_c,#MODE_SVC|I_BIT|F_BIT // Supervisor Mode        mov   sp,r0        sub   r0,r0,#SVC_STACK_SIZE        msr   CPSR_c,#MODE_SYS|I_BIT|F_BIT // System Mode        mov   sp,r0// Copy initialized data to its execution address in RAM// -----------------------------------------------------#ifdef ROM_RUN        ldr   r1,=_etext                // -> ROM data start        ldr   r2,=_data                 // -> data start        ldr   r3,=_edata                // -> end of data1:      cmp   r2,r3                     // check if data to move        ldrlo r0,[r1],#4                // copy it        strlo r0,[r2],#4        blo   1b                        // loop until done#endif// Clear .bss// ----------        mov   r0,#0                     // get a zero        ldr   r1,=__bss_start           // -> bss start        ldr   r2,=__bss_end__           // -> bss end2:      cmp   r1,r2                     // check if data to clear        strlo r0,[r1],#4                // clear 4 bytes        blo   2b                        // loop until done// Call main program: main(0)// --------------------------        mov   r0,#0                     // no arguments (argc = 0)        mov   r1,r0        mov   r2,r0        mov   fp,r0                     // null frame pointer        mov   r7,r0                     // null frame pointer for thumb        ldr   r10,=main        mov   lr,pc        bx    r10                       // enter main()        .size   _start, . - _start        .endfunc        .global _reset, _reset_, exit, _abort_        .func   _reset_reset:_reset_:exit:_abort_:#if 0// Disable interrupts, then force a hardware reset by driving P23 low// -------------------------------------------------------------------        mrs   r0,cpsr                   // get PSR        orr   r0,r0,#I_BIT|F_BIT        // disable IRQ and FIQ        msr   cpsr,r0                   // set up status register        ldr   r1,=(PS_BASE)             // PS Base Address        ldr   r0,=(PS_PIO)              // PIO Module        str   r0,[r1,#PS_PCER_OFF]      // enable its clock        ldr   r1,=(PIO_BASE)            // PIO Base Address        ldr   r0,=(1<<23)               // P23        str   r0,[r1,#PIO_PER_OFF]      // make sure pin is contolled by PIO        str   r0,[r1,#PIO_CODR_OFF]     // set the pin low        str   r0,[r1,#PIO_OER_OFF]      // make it an output#endif        b     .                         // loop until reset        .size _reset, . - _reset        .endfunc        .end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -