题目:SEED DM642的boot.asm程序
楼主位:
mvkl COPY_TABLE, a3 ; load table pointer
mvkh COPY_TABLE, a3
ldw *a3++, b1 ; Load entry point
copy_section_top:
ldw *a3++, b0 ; byte count
ldw *a3++, a4 ; ram start address
nop 3
[!b0] b copy_done ; have we copied all sections?
nop 5
copy_loop:
ldb *a3++,b5
sub b0,1,b0 ; decrement counter
[ b0] b copy_loop ; setup branch if not done
[!b0] b copy_section_top
zero a1//######
[!b0] and 3,a3,a1
stb b5,*a4++
[!b0] and -4,a3,a5 ; round address up to next multiple of 4
[ a1] add 4,a5,a3 ; round address up to next multiple of 4
以上是合众达DM642开发板boot.asm里拷贝代码段的程序,从//######开始以下的几行程序我实在看不明白,请高手执教阿
一楼回复:
这段代码是由于DSP的流水线原因产生延迟槽,导致执行的顺序发生变化,所以不好理解。load指令的delay slots是4,branch指令的delay slots是5,所以load执行时,后面的4条指令先执行,branch时后面5条指令先执行。你用这样的顺序在看一下。
另外,dsp外挂的flash是8位的,而段的起始位置是4字节对齐。所以,拷贝下个段之前要进行4自己对齐的调整。
转自:http://www.hellodsp.com/bbs/forum.php?mod=viewthread&tid=21138