- 积分
- 234
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
西门子6688Flash修改入门的入门
Jewes
看到很多机友都想为小8的DIY贡献一点自己的力量,可是苦于文科出身,狼大的《Flash修改入门》又有点深奥,现在我就在放假回家之前把我的理解写出来和大家一起分享(因为回家后只能拨号上,当然不能经常来论坛)希望能给大家一点帮助,能有更多的朋友加入到小8的修改中,让小8精神发扬光大!
一、小8的内存情况
以前经常都听说要在6M的FullFlash前填充10M的内容,可能很多机友还不明白是怎么一回事。请看下面的图:
[upload=jpg]UploadFile/2003123113385467581.jpg[/upload]
首先,小8的CPU能访问的地址空间是16M,大家知道计算机的内存分为RAM和ROM,RAM就是可以随时读取的写入的,ROM通常情况下只能读出,在一定条件下才能写入(这就是为什么要关机刷补丁的原因)。小8RAM包括了CPU内部的寄存器,内部RAM, 特殊功能寄存器SFR等,这些全部排在低位地址空间。小8的ROM包括了FlashROM和EEPROM总共6M,放在高位空间,就是16M地址空间的最后6M空间里面,这样有什么好处呢?比如现在我想为小8升内存(增加RAM),把它升级成X6688,如果我们把以前ROM直接放在了RAM的后面,增加RAM必然要影响到后面的ROM,因此就采用了占用两头,中间不用的办法。但是在程序设计的时候,仍然是按照16M的地址来使用的,比如访问ROM的第一个单元里面的数据的时候,仍然是按照用A00000地址来访问的,因此我们在反汇编6M的FullFLash的时候,要先把16M的地址空间添满,这样程序在执行跳转指令的时候才不会出错。
二、IDA反汇编的步骤和设置
现在我们就来把6M的FullFlash反汇编来看看。首先打开IDA如下:
[upload=jpg]UploadFile/2003123113393780849.jpg[/upload]
点击File->OpenFile,选择一个FullFlash文件,如下图:在Processor Type选择C166,这里没有什么好说的,点击OK进入下一步
[upload=jpg]UploadFile/2003123113402916958.jpg[/upload]
重要的一步:填充10M的空间,如图设置,在这里我们把前面的10M空间都作为小8的RAM,这样,16M地址空间就满了,点击OK,等上一段较长的时间,喝杯茶,上个厕所,就差不多了!在这个过程当中,要出现两个提示,不用理会它,直接点OK跳过就行。大家仔细分析一下下图的设置,在理解一下小8内存的情况,想想其中的道理。在InputFile的那个地方,Loading Address,就是把文件放到从A00000开始的地方,Fileoffser:文件的偏移量就是从文件的哪个地方开始读取,size当然就是读多少了。
[upload=jpg]UploadFile/2003123113412772834.jpg[/upload]
大家可以分析一下,如果是3618的8MFlash,改怎么设置,这就作为一个练习题目吧:)大家接下来就可以看看狼大的Flash修改入门了。看了以后再接着看后面的内容!
三、汇编程序的执行过程
当我们打开IDA后,可以看到很多指令,小8的运行就是不断执行这些指令的过程,小8是顺序、依次执行的,除非遇到跳转指令,但是小8是不可能无限执行这些指令的,因为指令是有限的(不知道能否理解,懂的人不要笑哈:)。因此在执行到一定时候会形成一个死循环,在这个循环中等待用户的输入或者外部事件的发生来打破这种死循环的局面,这就是所谓的中断。在小8中,这种死循环就是待机时候所处的状态(不完全正确),当你按了一个键或者有人Call你,或者定时时间到,这些就会打断这种循环的局面,从而转到相应的地方去处理,这些地方是预先定义好的中断入口地址,在那里去处理这些中断。(没有中断概念的可以去找点相关书来看看,我这里只是给点初步的印象,因此有些地方不是很严谨!)
四、一个简单例子
刚才我们讲到了死循环,现在我们来看看整点报时的例子。首先找到IDLE_ICON_PROCESS这个函数,地址:D637C8(至于如何找到这个函数的,那是因为我们站在巨人的肩上),根据名字就可以知道是待机时的图标处理,在待机状态是一直要执行的,同时在通话时也要执行的。在D637C开始的地方可以看到以下代码(为什么我看到的是88908880这些数字呢,你在那里按一下C,再看看出现什么了?不要笑哈:)
mov [-r0], r9
mov [-r0], r8 //保存寄存器
sub r0, #0Ch //因为我们这里是一直要执行的,所以我们就把代码添加到这里来,但是这里空间已经被占用了,怎么办?当然是先跳转到一个没有用的空间,然后我们在那里写了一个子函数,来处理。我们找了一个没有用的空间,写了以下代码
注:我反汇编的是最原始的整点报时的版本,用的情景模式3来控制使用与否的
ROM:BF0BC0 extp #0Dh, #2
ROM:BF0BC4 movb rl4, byte_364A4//得到情景模式3的数据
ROM:BF0BC8 mov r2, word_365DC//取得系统时间的分钟
ROM:BF0BCC jb r4.4, loc_BF0BF4//如果没有选择
ROM:BF0BD0 cmp r2, #0//如果是分钟数是0,表示到了整点
ROM:BF0BD2 jmpr cc_NZ, loc_BF0BEA
ROM:BF0BD4 extp #11h, #1
ROM:BF0BD8 movb rl4, byte_47840//用来判断是不是已经响过了,防止不停地响
ROM:BF0BDC cmpb rl4, #1
ROM:BF0BDE jmpr cc_NZ, loc_BF0BF4
ROM:BF0BE0 mov r12, #1// PlayWarningToneWhenOpen的参数,可以改成其他的来试试
ROM:BF0BE2 calls 0B5h, PlayWarningToneWhenOpen
ROM:BF0BE6 mov r4, #0
ROM:BF0BE8 jmpr cc_UC, loc_BF0BEC
ROM:BF0BEA ;
ROM:BF0BEA
ROM:BF0BEA loc_BF0BEA:
ROM:BF0BEA mov r4, #1
ROM:BF0BEC loc_BF0BEC:
ROM:BF0BEC extp #11h, #1
ROM:BF0BF0 movb byte_47840, rl4
ROM:BF0BF4 loc_BF0BF4:
ROM:BF0BF4 sub r0, #0Ch//因为我们占用了刚才那条指令,所以要补回来
ROM:BF0BF8 rets
由上可以很清楚地知道补丁的写法了,在IDLE_ICON_PROCESS的sub r0,#0ch处,改成calls BF0BC0,就这样,简单吧,如果对其中的一些指令不是很明白,先看看软件下载中的指令集。其实常用的就 Mov ,call ,ret,rets,jb,jnb,extp,jmp。这里讲一下extp,因为小8是段页是存储,简单地讲就是这个意思,比如我当前是在31f 这个页,我要去访问37页里面的数据,直接访问是不行的,就要用extp #37h,#1先切换到37页,其中的1表示extp指令后的一条指令是在37页内执行,最多可以取4。也许你要问当前在31f页是什么意思,就是说,你当前的程序是在31F*4000=C7C000这个地址以及以后的64k范围内。看了上面的程序,也许大家可以看到现在所要执行更多的指令,也许耗电量会增加(还有待考证)。
大家一定要多看看狼大的Flash修改入门,可以说我们很多人都是从那里走上小8的修改之路的,是我们修改的教材。
Redbean注:相关链接
@. 【专题文章】西门子Flash修改入门
@. 【程序修改】修改IDA程序以适合中文C166
@. 【专题文章】如何用UltraEdit构建Patch开发环境
@.Coollang—西门子手机修改进阶
|
-
【专题文章】西门子6688Flash修改入门的入门
-
【专题文章】西门子6688Flash修改入门的入门
-
【专题文章】西门子6688Flash修改入门的入门
-
【专题文章】西门子6688Flash修改入门的入门
|