这段程序是从龚俊S3C44BO_BIOS中的一个小段程序,实在是看不懂,那位能分析下???<br /><br /><br />if((prog_begin==0)&&overwrite0) {<br /> unsigned int ins;<br /> <br /> ins = *(unsigned int *)data_begin; <br /> if((ins>>24)==0xea) // instruction: b xxxx, now just support b instruction!!! <br /> bios_load_addr = ((ins&0xffffff)<<2)+8;<br /> else<br /> bios_load_addr = 4; // other instruction, jump to 4<br /> <br /> bios_load_addr = (bios_load_addr-BIOS_LOAD-8)/4;<br /> bios_load_addr = (bios_load_addr&0xffffff)|0xea000000; <br /> <br /> *(unsigned int *)data_begin = 0xea000000+(BIOS_BASE-8)/4; <br /> <br /> modify_a0 = 1;<br /> }<br /> cache_cfg = rNCACHBE0;<br /> rNCACHBE0 = 0x20000000;<br /> SectorProg(prog_begin, (unsigned short *)data_begin, size);<br /><br /> if(modify_a0) {<br /> size = FlashSector(size-1)+SECTOR_SIZE; <br /> <br /> FlashRead(FlashSector(BIOS_LOAD), (unsigned short *)(DFT_DOWNLOAD_ADDR+size), SECTOR_SIZE); <br /> *(unsigned int *)(DFT_DOWNLOAD_ADDR+size+SECTOR_SIZE-4) = bios_load_addr;<br /> SectorProg(FlashSector(BIOS_LOAD), (unsigned short *)(DFT_DOWNLOAD_ADDR+size), SECTOR_SIZE); <br /> }<br /> rNCACHBE0 = cache_cfg;<br />}<br />对if(modify_a0) {<br /> size = FlashSector(size-1)+SECTOR_SIZE; <br /> <br /> FlashRead(FlashSector(BIOS_LOAD), (unsigned short *)(DFT_DOWNLOAD_ADDR+size), SECTOR_SIZE); <br /> *(unsigned int *)(DFT_DOWNLOAD_ADDR+size+SECTOR_SIZE-4) = bios_load_addr;<br /> SectorProg(FlashSector(BIOS_LOAD), (unsigned short *)(DFT_DOWNLOAD_ADDR+size), SECTOR_SIZE); <br /> }<br />这一段实在是不明白. *(unsigned int *)(DFT_DOWNLOAD_ADDR+size+SECTOR_SIZE-4) = bios_load_addr;<br />放一条跳转指令.跳去那里?<br />BIOS_LOAD这个地址是怎样来的??<br />各位解释下,实在是看不懂. |
|