📄 bootldr.s
字号:
import |Load$$ER_RO$$Base|
import |Load$$ER_RW$$Base|
import |Load$$ER_ZI$$Base|
import |Image$$ER_RO$$Base|
import |Image$$ER_RW$$Base|
import |Image$$ER_ZI$$ZI$$Base|
import |Image$$ER_RO$$Limit|
import |Image$$ER_RW$$Limit|
import |Image$$ER_ZI$$ZI$$Limit|
export Loader
area Loader, code
code32
reglist rlist {r3-r12}
mov r13, lr; ; 保存lr地址
ldr r0, =|Load$$ER_RO$$Base| ; ER_RO运行时域的加载时地址
ldr r1, =|Image$$ER_RO$$Base| ; ER_RO运行时域的运行时地址
ldr r2, =|Image$$ER_RO$$Limit| ; ER_RO运行时域的长度
cmp r0, r1 ; 两个不一样则要搬移
blne move
ldr r0, =|Load$$ER_RW$$Base| ; ER_RW运行时域的加载时地址
ldr r1, =|Image$$ER_RW$$Base| ; ER_RW运行时域的运行时地址
ldr r2, =|Image$$ER_RW$$Limit| ; ER_RW运行时域的长度
cmp r0, r1 ; 两个不一样则要搬移
blne move
ldr r1, =|Image$$ER_ZI$$ZI$$Base| ; ER_ZI运行时域的运行时地址
ldr r2, =|Image$$ER_ZI$$ZI$$Limit| ; ER_ZI运行时域的长度
setZI mov r0, #0
cmp r1, r2 ; 两个不一样则要搬移
strcc r0, [r1], #4
bcc setZI
mov pc, r13 ; 返回
; 数据搬移子程序
; -----------------------------------------------------------
move
sub r3, r2, r1
cmp r3, #40 ; 尚剩余40以上字节,40字节40字节的搬
ldmgeia r0!, reglist
stmgeia r1!, reglist
bge move
moveWord
sub r3, r2, r1
cmp r3, #4 ; 尚剩余4个以上,不到40字节,4字节4字节的搬
ldrge r4, [r0], #4
strge r4, [r1], #4
bge moveWord
moveByte
cmp r1, r2 ; 尚剩余不到4字节,1字节1字节的搬
ldrccb r4, [r0], #1
strccb r4, [r1], #1
bcc moveByte
mov pc, lr ; 返回
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -