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

📄 arm_gcc_a.s

📁 一个基于ARM9的操作系统, 实现了很多的功能,包括内存管理,进程创建等
💻 S
字号:
/*
* file:
*       arm_a.S
* description:
*       implementation code depend on architecture.
*/

#define I_BIT       0x80
#define F_BIT       0x40
#define T_BIT       0x20
#define LOCKOUT     0xc0


.text
        .global _disable_int
        .global DisableInt
/* int _disable_int(void); */
_disable_int:
DisableInt:
        mrs     r1, cpsr
        and     r0, r1, #LOCKOUT
        orr     r1, r1, #LOCKOUT
        msr     cpsr_all, r1
        mov     pc, lr


        .global _enable_int
        .global EnableInt
/* void _enable_int(int istatus); */
_enable_int:
EnableInt:
        mrs     r1, cpsr
        bic     r1, r1, #LOCKOUT
        orr     r1, r1, r0
        msr     cpsr_all, r1
        mov     pc, lr


        .global _switch_thread_context
/* void _switch_thread_context(thread_context* new_context,
            thread_context* old_context); */
_switch_thread_context:
        mrs     r3, cpsr
        stmia   r1, {r3-r11, ip, sp, lr}


        .global _load_thread_context
/* void _load_thread_context(thread_context* new_context); */
_load_thread_context:
        ldmia   r0, {r3-r11, ip, sp, lr}
        msr     cpsr_all, r3
        mov     pc, lr


        .global _start_thread
/* void _start_thread(void); */
_start_thread:
        mov     r0, r6
        mov     lr, pc
        mov     pc, r5
        mov     lr, pc
        mov     pc, r4


        .global _get_stack_ptr
/* unsigned int _get_stack_ptr(void); */
_get_stack_ptr:
        mov     r0, sp
        mov     pc, lr


        .extern _irq_handler
        .extern _schedule_thread
        .global _irq_entry
/* void _irq_entry(int irq); */
_irq_entry:
        bl      _irq_handler                /* process irq. */

        mov     r0, sp                      /* pass irq sp to SYS mode. */
        add     sp, r0, #20                 /* restore irq stack. */
        ldr     lr, [sp], #4                /* restore return pc. */

        mrs     r1, spsr                    /* pass status register to SYS mode. */
        bic     r2, r1, #T_BIT
        orr     r3, r2, #LOCKOUT
        msr     spsr_all, r3                /* disable thumb and interrupt of SYS mode. */
        sub     r2, lr, #3                  /* pass return pc to SYS mode. */
                                            /* sub 3 for supporting thumb interwork. */
        subs    pc, pc, #4                  /* switch to SYS mode. */
        str     r2, [sp, #-4]               /* save pc. */
        str     r1, [sp, #-32]              /* save status register. */
        sub     sp, sp, #8                  /* adjust sp. */
        ldmfd   r0, {r0-r3, ip}             /* restore temporary register(r0-r3). */
        stmed   sp!, {r0-r3, ip, lr}        /* push stack. */

        bl      _schedule_thread            /* switch thread. */
        ldr     r3, [sp], #4
        msr     cpsr_all, r3                /* restore status register. */
        ldmfd   sp!, {r0-r3, ip, lr, pc}    /* pop stack and return. */
        .ltorg


        .end

⌨️ 快捷键说明

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