题目: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,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