非常感谢ofourme 的留言!经过重新仔细分析代码,发现了理解的失误。ofourme 的意思我基本明白了,但是我觉得可能表述的不是很正确。这里重新分析r0,r2,r3变量的变化,也和大家一起进步。
copy_proc_beg
417 adr r0, ResetEntry ;装载地址,ResetEntry值->r0
418 ldr r2, BaseOfROM ;BaseOfROM值(后面有定义)->r2
419 cmp r0, r2 ;比较RO,R2
420 ldreq r0, TopOfROM ;如果相等的话(说明在内存中运行),TopOfROM->r0
421 beq InitRam ;同时跳到InitRam
;/////////////////////////////////////////////////////////////////////////////////////////
;//上面的代码分析ResetEntry==BaseOfROM是否成立,以确定代码是否在内存中运行。
;//ResetEntry==BaseOfROM,则跳转到InitRam(该流程不做详细分析)
;//ResetEntry!=BaseOfROM,则执行下面的从norflash拷贝程序,
;//此时r0==ResetEntry、r2==BaseOfROM
;///////////////////////////////////////////////////////////////////////////////////////// 432 ldr r3, TopOfROM
;//此时,r3==TopOfROM 433 0 ;ldm批量数据加载指令,ldm后的ia表示每次传送后地址+1
434 ldmia r0!, {r4-r7} ;运行一次后R0=(R4到R7寄存器个数)*4
435 stmia r2!, {r4-r7} ;stm批量数据存储指令,!的作用,当数据传输完毕,将最后的地址写入R2
436 cmp r2, r3
437 bcc %B0 ;C标志置位/大于或小于时向后跳转到0标号处
438 ;最终实现拷贝数据到ram
/////////////////////////////////////////////////////////////////////////////////////////
;//从norflash拷贝程序到ram后,此时,r0==ResetEntry+(TopOfROM -BaseOfROM)
;//而r2==r3==TopOfROM
///////////////////////////////////////////////////////////////////////////////////////// 439 sub r2, r2, r3
440 sub r0, r0, r2
/////////////////////////////////////////////////////////////////////////////////////////
;//sub r2, r2, r3 执行完后 r2==r2-r3==0
;//sub r0, r0, r2 执行完后 r0==r0+r2==r0+0==ResetEntry+(TopOfROM -BaseOfROM)
;//即r0==ResetEntry+代码长度
///////////////////////////////////////////////////////////////////////////////////////// 结果是对了,但sub r2, r2, r3和sub r0, r0, r2好像没什么用处。
本人才疏学浅,以上分析如有错误,还请大家指正。谢谢!
[ 此帖被luxinkai在2010-06-21 15:49重新编辑 ]