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

📄 start.s

📁 os arm os arm os arm os arm os arm os arm os arm os arm os arm os arm os arm os arm os arm os arm
💻 S
字号:
/* *	ApOS (Another Project software for s3c2410) *	 *	This program is free software; you can redistribute it and/or modify *	it under the terms of the GNU General Public License version 2 as *	published by the Free Software Foundation. *			 *						Copyright caiyuqing * */ .include "init.inc".global _start.macro get_irq_stack	ldr	sp, =IRQ_STACK_BASE.endm/* *	save_user_registers 把UserMode的各个寄存器的值保存到irq stack *	中,我定义了每一个值 IRQ_STACK_FRAME_SIZE ,它的大小为68,等于 *	我们要保存的寄存器所占字节的总数 *	 *	我们要保存的寄存器有 r0-r12,sp^,lr^,pc^(lr),cpsr^ 总共17个寄存器 *	其中"^"表示UserMode下的寄存器 */.macro irq_save_user_registers	sub	sp, sp,#IRQ_STACK_FRAME_SIZE	stmia	sp, {r0-r12}	add     r8, sp, #52	stmia   r8!, {sp,lr}^	str     lr, [r8]	mrs     r6, spsr	str     r6, [r8,#4]	mov	r0, sp		@此时sp指向r0的存储地址.endm/* *	重新载入UserMode的各个寄存器的值 *	"subs	pc, lr,#4" 把系统从IRQMode返到回UserMode *	事实上这条指令做了两个操作,分别是: *		1.把 lr减4拷贝到pc中 *		2.把当前模式下的spsr拷贝到cpsr中 *	注意subs (不是sub),"s" 引起了spsr到cpsr的拷贝操作 */.macro irq_load_user_registers	ldmia	sp, {r0-lr}^	@此时sp必须指向r0的存储地址	ldr	lr, [sp,#60]	add	sp, sp,#IRQ_STACK_FRAME_SIZE	subs	pc, lr,#4.endm.macro get_abt_stack		ldr	sp, =ABORT_STACK_BASE.endm.macro abt_save_user_registers	sub	sp, sp,#ABORT_STACK_FRAME_SIZE	stmia	sp, {r0-r12}	add     r8, sp, #52	stmia   r8!, {sp,lr}^	str     lr, [r8]	mrs     r6, spsr	str     r6, [r8,#4]	mov	r0, sp.endm.macro dabt_load_user_registers	ldmia	sp, {r0-lr}^	ldr	lr, [sp,#60]	add	sp, sp,#ABORT_STACK_FRAME_SIZE	subs	pc, lr,#8.endm.macro pabt_load_user_registers	ldmia	sp, {r0-lr}^	ldr	lr, [sp,#60]	add	sp, sp,#ABORT_STACK_FRAME_SIZE	subs	pc, lr,#4.endm/* *	每个任务必须有自己独立的svc堆栈,因为任务有可能在 *	svc模式下睡眠,所以能把svc模式下的数据进行保存 */.macro get_swi_stack	ldr	sp, =SVC_STACK_BASE.endm.macro swi_save_user_registers	sub	sp, sp,#SVC_STACK_FRAME_SIZE	stmia	sp, {r0-r12}	add     r8, sp, #52	stmia   r8!, {sp,lr}^	str     lr, [r8]	mrs     r6, spsr	str     r6, [r8,#4]	mov	r0, sp.endm.macro swi_load_user_registers	ldmia	sp, {r0-lr}^	@此时sp必须指向r0的存储地址	ldr	lr, [sp,#60]	add	sp, sp,#SVC_STACK_FRAME_SIZE	movs	pc, lr.endm@ the Qboot image start here!_start:@ Exception vector table@ 0x00 Reset Supervisor	ldr	pc,=reset@ 0x04 Undefined instruction	ldr	pc,=undefined_instruction@ 0x08 Software Interrupt	ldr	pc,=software_interrupt@ 0x0C Abort (prefetch)	ldr	pc,=prefetch_abort@ 0x10 Abort (data)	ldr	pc,=data_abort@ 0x14 Reserved	ldr	pc,=reserved@ 0x18 IRQ	ldr	pc,=irq@ 0x1C FIQ	ldr	pc,=fiqreset:	ldr 	r0,=AbortMode	msr	cpsr,r0			@ 进入 AbortMode	ldr	sp,=ABORT_STACK_BASE	@ 初始化 IRQ_Stack		ldr 	r0,=IRQMode	msr	cpsr,r0			@ enter IRQ Mode	ldr	sp,=IRQ_STACK_BASE	@ init IRQ Stack	ldr 	r0,=SupervisorMode	msr	cpsr,r0			@ enter System Mode	ldr	sp,=SYS_STACK_BASE	@ init System Stack		ldr 	r0,=SystemMode	msr	cpsr,r0			@ enter System Mode	ldr	sp,=SYS_STACK_BASE	@ init System Stack		ldr 	lr,=halt_loop	ldr	pc,=mainhalt_loop:	b 	halt_loopundefined_instruction:	b undefined_instruction	software_interrupt:	get_swi_stack	swi_save_user_registers	ldr lr,=ret1	ldr pc,=do_system_callret1:	swi_load_user_registersprefetch_abort:	get_abt_stack	abt_save_user_registers	ldr lr,=ret2	ldr pc,=do_prefetch_abortret2:	pabt_load_user_registersdata_abort:	get_abt_stack	abt_save_user_registers	ldr lr,=ret3	ldr pc,=do_data_abortret3:	dabt_load_user_registers	reserved:	b .	irq:	get_irq_stack	irq_save_user_registers	ldr lr,=ret4	ldr pc,=do_irqret4:	irq_load_user_registersfiq:	b .

⌨️ 快捷键说明

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