[code]; Restart from the RAM position after copying.
mov pc, r0 ;r0= 0x38000+#PHYBASE=0X30038000修改了PC相当于改变了存储指令地址,实现跳转
nop ;疑惑:既然已经跳转到内存中执行,但是为什么后面还会执行到20 标号下的东西呢
nop ;难道在内存中的函数使ARM再回来执行这个startup.s这个函数?
但是在前面有一句
///////////////////原来的代码如下
;------------------------------------------------------------------------------
; Copy boot loader to memory
ands r9, pc, #0xFF000000 ; see if we are in flash or in ram
bne %f20 ; go ahead if we are already in ram
; This is the loop that perform copying.
ldr r0, = 0x38000 ; offset into the RAM
add r0, r0, #PHYBASE ; add physical base
mov r1, r0 ; (r1) copy destination
ldr r2, =0x0 ; (r2) flash started at physical address 0
ldr r3, =0x10000 ; counter (0x40000/4)
10 ldr r4, [r2], #4
str r4, [r1], #4
subs r3, r3, #1
bne %b10
; Restart from the RAM position after copying.
mov pc, r0 ;r0= 0x38000+#PHYBASE=0X30038000修改了PC相当于改变了存储指令地址,实现跳转
nop ;疑惑:既然已经跳转到内存中执行,但是为什么后面还会执行到20 标号下的东西呢
nop ;难道在内存中的函数使ARM再回来执行这个startup.s这个函数?但是就算回来,但是
nop ;感觉也没有这个必要啊
----------------------------下面两句说明了在执行内存中的代码的时候有执行了startup.s这个汇编代码
ands r9, pc, #0xFF000000 ; see if we are in flash or in ram
bne %f20 ; go ahead if we are already in ram
---------怎么会这样呢?麻烦指教一下。也许是我钻进了死胡同
你的看法没错
ldr r0, = 0x38000 ; offset into the RAM
add r0, r0, #PHYBASE ; add physical base
拷贝之前,这里先把拷贝后的目标地址先保存在r0里面,也就是说R0保存的是拷贝到内存之后的EBOOT首地址
拷贝完成之后
; Restart from the RAM position after copying.
mov pc, r0
这就跳转到内存当中的EBOOT入口再进来。
这样它的代码写起来简单一点。
当然,不同的EBOOT启动代码写法也不一样,这个还是要看程序员的心情^_^