testasm.s
来自「汇编编写的ARM启动代码」· S 代码 · 共 141 行
S
141 行
; 定义输出的全局符号
export Exit
import Loader
include defines.s
five equ 5
; 用于返回arm的子程序段
; --------------------------------------------------------------
area Exit, code
code32
MOV r0, #0x18 ; angel_SWIreason_ReportException
LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit
SWI 0x123456 ; ARM semihosting SWI
; 设置所有特权模式的堆栈
; --------------------------------------------------------------
area SetSp, code
code32
mrs r0, cpsr
mov r1, r0 ; 保存当前cpsr
bic r0, r0, #&1f ; 清零低5位
add r2, r0, #MODE_FIQ
msr cpsr_c, r2;
ldr sp, =SP_FIQ_BASE
add r2, r0, #MODE_IRQ
msr cpsr_c, r2;
ldr sp, =SP_IRQ_BASE
add r2, r0, #MODE_SVC
msr cpsr_c, r2;
ldr sp, =SP_SVC_BASE
add r2, r0, #MODE_ABT
msr cpsr_c, r2;
ldr sp, =SP_ABT_BASE
add r2, r0, #MODE_UND
msr cpsr_c, r2;
ldr sp, =SP_UND_BASE
add r2, r0, #MODE_SYS
msr cpsr_c, r2;
ldr sp, =SP_USR_BASE
msr cpsr_fsxc, r1
mov pc, lr
; 一个初始化数据段
; --------------------------------------------------------------
area initedData
code32
msg = "This is a test program!", 0
cde dcd &e3a000fe
; 中断向量表
; --------------------------------------------------------------
area Vectors, code
code32
entry
ldr pc, reset_1
ldr pc, undefine_6
ldr pc, swi_6
ldr pc, Iabort_5
ldr pc, Dabort_2
dcd 0
ldr pc, irq_4
ldr pc, fiq_3
reset_1 & ResetIntHandler
undefine_6 & 0
swi_6 & 0
Iabort_5 & 0
Dabort_2 & 0
irq_4 & 0
fiq_3 & 0
; 复位处理
; --------------------------------------------------------------
area ResetIntHandler, code
code32
; 如果ROM不位于0,则要把中断向量表搬移到0(RAM)中,然后地址重映射
; .......
bl Loader ; 搬移运行时域
bl SetSp ; 设置堆栈
ldr r0, =loop
;msr cpsr_c, #2_10000
msr cpsr_c, #&10 ;开中断,转入用户模式
loop nop
b loop
b Exit
; 存储区设置
; 物理地址映射配置
; 虚拟存储管理配置,各级页表
; --------------------------------------------------------------
area MemInit, code
code32
mov pc, lr
end
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?