打印

分析下这段程序,真的很考人

[复制链接]
1642|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
eagle758|  楼主 | 2007-12-19 18:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AD, IO, se, bios, os
这段程序是从龚俊S3C44BO_BIOS中的一个小段程序,实在是看不懂,那位能分析下???


if((prog_begin==0)&&overwrite0) {
   unsigned int ins;
  
   ins = *(unsigned int *)data_begin;    
   if((ins>>24)==0xea)   // instruction: b xxxx, now just support b instruction!!!   
    bios_load_addr = ((ins&0xffffff)<<2)+8;
   else
    bios_load_addr = 4;  // other instruction, jump to 4
             
   bios_load_addr = (bios_load_addr-BIOS_LOAD-8)/4;
   bios_load_addr = (bios_load_addr&0xffffff)|0xea000000;     
    
   *(unsigned int *)data_begin = 0xea000000+(BIOS_BASE-8)/4;    
  
   modify_a0 = 1;
  }
  cache_cfg = rNCACHBE0;
  rNCACHBE0 = 0x20000000;
  SectorProg(prog_begin, (unsigned short *)data_begin, size);

  if(modify_a0) {
   size = FlashSector(size-1)+SECTOR_SIZE;    
  
   FlashRead(FlashSector(BIOS_LOAD), (unsigned short *)(DFT_DOWNLOAD_ADDR+size), SECTOR_SIZE);   
   *(unsigned int *)(DFT_DOWNLOAD_ADDR+size+SECTOR_SIZE-4) = bios_load_addr;
   SectorProg(FlashSector(BIOS_LOAD), (unsigned short *)(DFT_DOWNLOAD_ADDR+size), SECTOR_SIZE); 
  }
  rNCACHBE0 = cache_cfg;
}
对if(modify_a0) {
   size = FlashSector(size-1)+SECTOR_SIZE;    
  
   FlashRead(FlashSector(BIOS_LOAD), (unsigned short *)(DFT_DOWNLOAD_ADDR+size), SECTOR_SIZE);   
   *(unsigned int *)(DFT_DOWNLOAD_ADDR+size+SECTOR_SIZE-4) = bios_load_addr;
   SectorProg(FlashSector(BIOS_LOAD), (unsigned short *)(DFT_DOWNLOAD_ADDR+size), SECTOR_SIZE); 
  }
这一段实在是不明白. *(unsigned int *)(DFT_DOWNLOAD_ADDR+size+SECTOR_SIZE-4) = bios_load_addr;
放一条跳转指令.跳去那里?
BIOS_LOAD这个地址是怎样来的??
各位解释下,实在是看不懂.

相关帖子

沙发
whereis| | 2007-12-19 18:46 | 只看该作者

.

打个电话,问问龚俊不就得了。

使用特权

评论回复
板凳
eagle758|  楼主 | 2007-12-19 19:55 | 只看该作者

re

龚俊的电话是多少

使用特权

评论回复
地板
lelee007| | 2007-12-19 21:02 | 只看该作者

BIOS_LOAD

都大写,估计是预定义的
嘿嘿,瞎猜,没看过龚俊的代码

使用特权

评论回复
5
王紫豪| | 2007-12-19 22:53 | 只看该作者

有啥考人的?自己不统一风格的代码看都不看!

使用特权

评论回复
6
qq26358275| | 2007-12-20 20:59 | 只看该作者

re

*(unsigned int *)(DFT_DOWNLOAD_ADDR+size+SECTOR_SIZE-4) = bios_load_addr

这样写你就明白了
unsigned int* p;
p = DFT_DOWNLOAD_ADDR+size+SECTOR_SIZE-4;
*p = bios_load_addr;
其实就是把值为DFT_DOWNLOAD_ADDR+size+SECTOR_SIZE-4的地址赋值为bios_load_addr

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

119

帖子

0

粉丝