爱技术

 找回密码
 注册会员

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 6336|回复: 15
收起左侧

[原创] 如何用Keil ARM编译器作x65的Patch

  [复制链接]
发表于 2005-8-15 00:00:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册会员 微信登录

x
主要以"替换运营商标志为自定义字串V2"为例说一下怎么用Keil ARM编译器来做Patch或者移植。

最近一段时间,因为Patch的原因,我试用了所有的主流ARM编译器,包括ADS1.2,RealView2.0,GCC for ARM,Keil ARM。最后发现,最合适的工具就是Keil ARM。虽然还有一些小问题,不过起来最解决。首先,Keil在代码定位方面是最容易的,ADS和GCC都需要用独立的链接文件才能做到Patch这样的松散定位,但仍然很费劲,而且比如ADS需要你的段开始于4字节的边界。这是很麻烦的,很多时候我们要Hook的BL指令开始于2字节边界,此外,这些编译器对于调用地址有很多限制,比如简单的BL指令,在ADS中就很难完成,而BLX指令在ADS中甚至会出错。
痛苦中,我甚至打算自己写一个汇编器,实际我也完成了词法和语法,可以处理简单的BL和BLX,不过从avkiev那里得到解决BLX的办法后,我还是放弃了这个计划。虽然Keil有一些缺陷,但毕竟可以忍受。为了配合Keil,我又重新写了一下Hex2VKP工具,目的只有一个,使Patch工作变简单,目标就是像Riza的sfe那样。(我的编译器计划是apm,ARM Patch Maker)。
下面我就结合"替换运营商标志为自定义字串V2"说明一下基本步骤,为了这个,我已经把它完全移植到Keil下了。下面是这个Patch的所有工程文件。
这个工程里面主要有三个源文件,startup.s、RepSP.c、x65.h。还有Keil的工程文件RepSP.Uv2和Hex2vkp这个工具。startup.s是汇编文件,主要是Hook部分及一些Thunk的函数。RepSP.c是主文件,里面包括了所有的程序部分。而x65.h是头文件,里面定义了一些函数原形和结构体。hex2vkp是我专门为hex文件转换为vkp而写的工具,最新重写了一下,增强一下功能,它的格式如下:
  1. hex2vkp [-h? -bbaseaddr -fflashfile -ccommentsfile -ovkpfile] [hexfile ...]
  2.         -c  specify a commentsfile to describe vkp, all line should be output
  3.             until a line begin with ';;' is found.
  4.         -b  specify base address of fullflash, default A0000000
  5.         -f  specify original fullflash file
  6.         -h  produce this help message
  7.         -o  specify output vkp file, default to console
  8.         -v  report hex2vkp version info
复制代码

可以指定基地址,默认是A0000000,fullflash文件,注释文件和输出文件。同时输入可以指定一系列的hex文件。
我们主要看一下这个工程中和地址定位相关的部分。

首先是整个工程的地址,在这里面我使用了0x800000开始的Flash部分,指定是在工程的目标选项的的LA Location的里面,作如下指定。
User Classes:DATA (0xA8000000-0xA87FFFFF), CODE (0xA0800040-0xA081FFFF), CONST (0xA0800040-0xA081FFFF)
这里面主要指定了程序的数据部分、代码部分、常量区。
然后是Hook的地址指定,这个我们看一下startup.s。
  1. ;***替换运营商标志为自定义字串V2.1***
  2. ;(C) Bennie
  3. ;for S6CV50
  4. ;v2.1->重写了代码

  5. ;支持的格式:
  6. ;%Y  -   年(四位数字)2005
  7. ;%y  -   年(两位数字)05
  8. ;%M  -   月  06
  9. ;%D  -   日  23  
  10. ;%W  -   星期    四
  11. ;%H  -   时 00
  12. ;%F  -   分 56
  13. ;%R  -   信号强度 -46
  14. ;%A  -   电池电压 3807
  15. ;%a  -   电池电压,百分数 56
  16. ;%T  -   环境温度 30,74
  17. ;对齐格式字符:0xE01C=中,0xE01D=右,0xE01E=左

  18. ;屏幕保护自定义字串,注意必须以\0结尾,最大15个字符。
  19. ;0x800000: '%M-%D %W %H:%F\0'
  20. ;待机画面自定义字串
  21. ;0x800020: '%R %A %T\0'
  22. ;;==============================================================

  23.            EXTERN CODE16(entryMainscreen?T)
  24.            EXTERN CODE16(entryScreensaver?T)

  25. ;待机时调用获得运营商名字的函数Hook
  26. AREA   STARTUPCODE1, CODE, AT 0xA0AFCB82   // READONLY, ALIGN=4
  27.         CODE16
  28.            PUSH        {LR}
  29.            BL         entryScreensaver?T
  30.            POP        {PC}
  31.                                                                          
  32. ;屏保时调用获得运营商名字的函数Hook
  33. AREA   STARTUPCODE2, CODE, AT 0xA08DAF2E   // READONLY, ALIGN=4
  34.         CODE16

  35.            BL         entryMainscreen?T

  36. ;函数Thunk,处理一下dwmoddw函数     
  37. AREA   THUNKFUNCTION, CODE, AT 0xA0800040   // READONLY, ALIGN=4

  38.         PUBLIC         dwmoddw?T

  39.         dwmoddw?T PROC CODE16
  40.            LDR        R2, =0xA160948C
  41.            BX         R2
  42.         ENDP  
  43. END
复制代码


前面的部分是最终vkp的注释部分,这个由hex2vkp输出到vkp的开始。然后前面两个Extern知名了这两个函数是外部函数,然后第一个AREA开始的部分指定了一个区段,后面是这个区段的属性,比如属于那个段(代码段)、对齐边界(默认是4),以及开始地址。可以指定地址是我选择Keil的主要原因,在别的工具上,做这个就困难多了。然后下面的CODE16是说明下面是THUMB指令,在下面就是代码部分了。下面的部分类似,除了最后一个是函数THUNK有点不同,那个主要原因是KEIL在处理多个函数返回值时,用函数指针有点问题,所以我用了C和ASM的混合链接。前面那个PUBLIC是导出一个符号,这里面体现了KEIL对混合编译的符号处理。导出的符号要加上?T或?A。才可以被别的模块使用。后面声名了一个Thumb例程。

下面我们再看一下RepSP.c里面和地址定位有关的部分。
  1. #include "x65.h"

  2. #define S6CV50
  3. /*
  4. 0x800000: '%M-%D %W %H:%F\0'
  5. 0x800020: '%R %A %T\0'
  6. */
  7. const word format[2][16] __at 0xA0800000;

  8. const unsigned short w1_7[] = {          
  9.         0x4E00, //一
  10.         0x4E8C,        //二
  11.         0x4E09,        //三
  12.         0x56DB,        //四
  13.         0x4E94,        //五
  14.         0x516D,        //六       
  15.         0x65E5        //日
  16. };

  17. #ifdef S6CV50
  18. //for system function
  19. const GETDATETIME getdate         = (GETDATETIME)0xA0AA6A53;
  20. const GETWEEK getweek                 = (GETWEEK)0xA082AD87;
  21. const GetAkku getakku                 = (GetAkku)0xA1254830;
  22. const f_uint2str uint2str         = (f_uint2str)0xA0825687;
  23. //const DWMODDW dwmoddw         = (DWMODDW)0xA160948C; //because Keil's problem

  24. //for system data with Absolute Location.
  25. word Akkpct __at 0xA863FF08;
  26. word net         __at 0xA86F0BB8;
  27. #endif

  28. extern int_int dwmoddw(int a, int b);
  29. 。。。。。。。
复制代码

无关的部分我已经省略,前面是包含头文件,之后定一个宏,在下面那个格式字串就涉及到了变量的决定定址,在Keil里面试用__at关键词。然后后面是一个常量数组,需要注意的是这些一定要声明为常量,否则会被定位到数据区去。在之后就是本工程使用的函数部分。这个函数原形的声明在x65.h里面,再后面是两个全局变量的绝对定址。分别时电池容量百分比和网络信号强度。这些是和地址有关的部分,在下面的一个声明是为了和startup.s里面联合编译使用的声明部分,Keil对这种用R0-R3返回变量的功能支持也有问题,所以我用了一个Thunk。

此外,我们要设置工程的输出文件为Intel的Hex格式,然后还要设置附加的命令,让他编译完成后自动转换Hex为VKP,那么在Outpu选项卡里面不仅要设定输出格式,还要在User Program那里写下如下的命令:
  1. .\hex2vkp -fE:\siemens\tools\S6CV50.bin  -cstartup.s -oRepSP.vkp output\RepSP.hex
复制代码

意思是原始文件是E:\siemens\tools\S6CV50.bin,这个需要改成你自己的,注释来自于startup.s,输出为RepSP.vkp。输入是output\RepSP.hex。
这样在编译完成后就会自动生成vkp了。

那么,了解了这个工程的各部分以后,我们看一下为了移植这个工程,你需要处理那些部分。可能这才是大家需要的!
移植这个需要处理的函数有:
  1. const GETDATETIME getdate         = (GETDATETIME)0xA0AA6A53;
  2. const GETWEEK getweek                 = (GETWEEK)0xA082AD87;
  3. const GetAkku getakku                 = (GetAkku)0xA1254830;
  4. const f_uint2str uint2str         = (f_uint2str)0xA0825687;
  5. //const DWMODDW dwmoddw         = (DWMODDW)0xA160948C; //because Keil's problem

  6. AREA   THUNKFUNCTION, CODE, AT 0xA0800040   // READONLY, ALIGN=4

  7.         PUBLIC         dwmoddw?T

  8.         dwmoddw?T PROC CODE16
  9.            LDR        R2, =0xA160948C
  10.            BX         R2
  11.         ENDP  
复制代码

需要注意的是,如果是Thumb模式的函数,因为是函数指针,最后一个bit为1。即在函数地址上加1。特别的是dwmoddw是在startup.s里面用thumb处理的。涉及到的全局变量有:
  1. word Akkpct __at 0xA863FF08;
  2. word net         __at 0xA86F0BB8;
复制代码
涉及到的函数Hook有:
  1. AREA   STARTUPCODE1, CODE, AT 0xA0AFCB82   // READONLY, ALIGN=4
  2. AREA   STARTUPCODE2, CODE, AT 0xA08DAF2E   // READONLY, ALIGN=4
复制代码

还有就是Patch的占用地址了,这个在工程选项里设定。

对于这些,我们从几个方面入手:
从待机的显示和处理可以找到getdate  getweek dwmoddw 以及信号强度的变量地址
从工模的ACCU菜单可以找到getakku  uint2str 和电池的百分比容量。
那么我分别给出S65的类似部分。

  1. A1253530             ; 圹圹圹圹圹圹圹?S U B R O U T I N E 圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹?
  2. A1253530
  3. A1253530
  4. A1253530             wndACCUMonitor                          ; CODE XREF: j_wndACCUMonitorj
  5. A1253530                                                     ; DATA XREF: ROM:off_A0A2EBD8o
  6. A1253530
  7. A1253530             var_34          = -0x34
  8. A1253530             var_30          = -0x30
  9. A1253530             var_2C          = -0x2C
  10. A1253530
  11. A1253530 F0 4D 2D E9                 STMFD   SP!, {R4-R8,R10,R11,LR}
  12. A1253534 01 40 A0 E1                 MOV     R4, R1
  13. A1253538 00 70 A0 E1                 MOV     R7, R0
  14. A125353C 04 00 A0 E1                 MOV     R0, R4
  15. A1253540 4C 13 9F E5                 LDR     R1, =asc_A1410094
  16. A1253544 18 D0 4D E2                 SUB     SP, SP, #0x18
  17. A1253548 9A 20 A0 E3                 MOV     R2, #0x9A
  18. A125354C 71 D7 0E EB                 BL      memcpy
  19. A1253550 0C 20 A0 E3                 MOV     R2, #0xC
  20. A1253554 CF 1F 8F E2                 ADR     R1, asc_A1253898 ; "AkkuMon (1)"
  21. A1253558 07 00 A0 E1                 MOV     R0, R7
  22. A125355C 6D D7 0E EB                 BL      memcpy
  23. A1253560 09 10 A0 E3                 MOV     R1, #9
  24. A1253564 00 00 A0 E3                 MOV     R0, #0
  25. A1253568 B0 04 00 EB                 BL      GetAkku
  26. A125356C 08 00 8D E5                 STR     R0, [SP,#0x38+var_30]
  27. A1253570 00 00 A0 E3                 MOV     R0, #0
  28. A1253574 07 10 A0 E3                 MOV     R1, #7
  29. A1253578 AC 04 00 EB                 BL      GetAkku
  30. A125357C 04 00 8D E5                 STR     R0, [SP,#0x38+var_34]
  31. A1253580 00 00 A0 E3                 MOV     R0, #0
  32. A1253584 08 10 A0 E3                 MOV     R1, #8
  33. A1253588 A8 04 00 EB                 BL      GetAkku
  34. A125358C 00 50 A0 E1                 MOV     R5, R0
  35. A1253590 00 00 A0 E3                 MOV     R0, #0
  36. A1253594 06 10 A0 E3                 MOV     R1, #6
  37. A1253598 A4 04 00 EB                 BL      GetAkku
复制代码

这个地方那个可以找到GetAKKU和uint2str 和百分比容量

  1. A12536F0 7A 00 84 E2                 ADD     R0, R4, #0x7A
  2. A12536F4 07 D7 0E EB                 BL      memcpy
  3. A12536F8 9C 04 1F E5                 LDR     R0, =0xA863FF08   ;这个地址就是百分比容量
  4. A12536FC 04 20 A0 E3                 MOV     R2, #4
  5. A1253700 0C 10 8D E2                 ADD     R1, SP, #0x38+var_2C
  6. A1253704 B0 00 D0 E1                 LDRH    R0, [R0]
  7. A1253708 DD 47 D7 FB                 BLX     uint2str
  8. A125370C 04 20 A0 E3                 MOV     R2, #4
  9. A1253710 0C 10 8D E2                 ADD     R1, SP, #0x38+var_2C
  10. A1253714 82 00 84 E2                 ADD     R0, R4, #0x82
  11. A1253718 FE D6 0E EB                 BL      memcpy
  12. A125371C CC 54 1F E5                 LDR     R5, =0xA863FF00
  13. A1253720 18 00 95 E5                 LDR     R0, [R5,#0x18]
  14. A1253724 00 00 50 E3                 CMP     R0, #0
  15. A1253728 38 00 00 0A                 BEQ     loc_A1253810
  16. A125372C B2 00 D0 E1                 LDRH    R0, [R0,#2]
  17. A1253730 04 20 A0 E3                 MOV     R2, #4
  18. A1253734 0C 10 8D E2                 ADD     R1, SP, #0x38+var_2C
  19. A1253738 D1 47 D7 FB                 BLX     uint2str
复制代码


从GetSPNameWrap出发,可以找到待机和屏保时的Hook地址,如下:
  1. A08DAF28             ; 圹圹圹圹圹圹圹?S U B R O U T I N E 圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹圹?
  2. A08DAF28
  3. A08DAF28
  4. A08DAF28             GetSPNameWrap                           ; CODE XREF: ROM:A08DB0C4p
  5. A08DAF28                                                     ; ROM:A08DB176p ...
  6. A08DAF28 70 B5                       PUSH    {R4-R6,LR}
  7. A08DAF2A 05 1C                       ADD     R5, R0, #0
  8. A08DAF2C 00 21                       MOV     R1, #0
  9. A08DAF2E 21 F2 28 FE                 BL      GetSPName    ;待机时Hook的就是这个地址。屏保时Hook的是GetSPName这个函数的开始。
  10. A08DAF32 01 28                       CMP     R0, #1
  11. A08DAF34 17 D1                       BNE     loc_A08DAF66
  12. A08DAF36 28 1C                       ADD     R0, R5, #0
  13. A08DAF38 52 F1 0A E9                 BLX     sub_A0A2D150
  14. A08DAF3C 06 1C                       ADD     R6, R0, #0
  15. A08DAF3E 01 24                       MOV     R4, #1
  16. A08DAF40 0D E0                       B       loc_A08DAF5E
  17. A08DAF42             ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
  18. A08DAF42
  19. A08DAF42             loc_A08DAF42                            ; CODE XREF: GetSPNameWrap+38j
  20. A08DAF42 21 1C                       ADD     R1, R4, #0
  21. A08DAF44 28 1C                       ADD     R0, R5, #0
  22. A08DAF46 52 F1 74 EE                 BLX     sub_A0A2DC30
  23. A08DAF4A 0A 28                       CMP     R0, #0xA
  24. A08DAF4C 04 D1                       BNE     loc_A08DAF58
  25. A08DAF4E 22 1C                       ADD     R2, R4, #0
  26. A08DAF50 20 21                       MOV     R1, #0x20
  27. A08DAF52 28 1C                       ADD     R0, R5, #0
  28. A08DAF54 52 F1 3E EE                 BLX     sub_A0A2DBD4
  29. A08DAF58
  30. A08DAF58             loc_A08DAF58                            ; CODE XREF: GetSPNameWrap+24j
  31. A08DAF58 01 34                       ADD     R4, #1
  32. A08DAF5A 24 04                       LSL     R4, R4, #0x10
  33. A08DAF5C 24 0C                       LSR     R4, R4, #0x10
  34. A08DAF5E
  35. A08DAF5E             loc_A08DAF5E                            ; CODE XREF: GetSPNameWrap+18j
  36. A08DAF5E B4 42                       CMP     R4, R6
  37. A08DAF60 EF D9                       BLS     loc_A08DAF42
  38. A08DAF62 01 20                       MOV     R0, #1
  39. A08DAF64 70 BD                       POP     {R4-R6,PC}
  40. A08DAF66             ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
  41. A08DAF66
  42. A08DAF66             loc_A08DAF66                            ; CODE XREF: GetSPNameWrap+Cj
  43. A08DAF66 00 20                       MOV     R0, #0
  44. A08DAF68 70 BD                       POP     {R4-R6,PC}
复制代码


GetDate可以查找类似的特征码,而GetWeek也可以,dwMODdw函数就在GetWeek里面,不过可能是一个Thunk跳转。
  1. A082AD86
  2. A082AD86             GetWeek                                 ; DATA XREF: sub_A0C5E764:off_A0C5E76Co
  3. A082AD86 80 B5                       PUSH    {R7,LR}
  4. A082AD88 FF F7 C3 FF                 BL      sub_A082AD12
  5. A082AD8C 01 1D                       ADD     R1, R0, #4
  6. A082AD8E 07 20                       MOV     R0, #7
  7. A082AD90 0D F0 CC EE                 BLX     j_dwMODdw_0
  8. A082AD94 08 06                       LSL     R0, R1, #0x18
  9. A082AD96 00 0E                       LSR     R0, R0, #0x18
  10. A082AD98 80 BD                       POP     {R7,PC}
复制代码

如下,前面的其实是一个thunk。
  1. A0838B2C
  2. A0838B2C             ; Attributes: thunk
  3. A0838B2C
  4. A0838B2C             j_dwMODdw_0                             ; CODE XREF: sub_A082AC58+Cp
  5. A0838B2C                                                     ; sub_A082ACEC+Ap ...
  6. A0838B2C 04 F0 1F E5                 LDR     PC, =dwMODdw
  7. A0838B2C             ; End of function j_dwMODdw_0
  8. A0838B2C
  9. A0838B2C             ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
  10. A0838B30 8C 94 60 A1 off_A0838B30    DCD dwMODdw             ; DATA XREF: j_dwMODdw_0r
复制代码


剩下的就是网络信号了,可以从下面找到:
  1. A08C0430
  2. A08C0430             GetSignIconID                           ; CODE XREF: sub_A08BFE54+3Ap
  3. A08C0430 70 B5                       PUSH    {R4-R6,LR}
  4. A08C0432 2A 48                       LDR     R0, =0xA860E594
  5. A08C0434 2A 4E                       LDR     R6, =0xFFFF
  6. A08C0436 00 68                       LDR     R0, [R0]
  7. A08C0438 00 28                       CMP     R0, #0
  8. A08C043A 05 D1                       BNE     loc_A08C0448
  9. A08C043C 25 48                       LDR     R0, byte_A08C04D4
  10. A08C043E 00 88                       LDRH    R0, [R0]
  11. A08C0440 C0 07                       LSL     R0, R0, #0x1F
  12. A08C0442 01 D4                       BMI     loc_A08C0448
  13. A08C0444 30 1C                       ADD     R0, R6, #0
  14. A08C0446 70 BD                       POP     {R4-R6,PC}
  15. A08C0448             ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
  16. A08C0448
  17. A08C0448             loc_A08C0448                            ; CODE XREF: GetSignIconID+Aj
  18. A08C0448                                                     ; GetSignIconID+12j
  19. A08C0448 26 4C                       LDR     R4, =word_A0A318B2
  20. A08C044A 6D F1 D8 E8                 BLX     GetNetSignValue
  21. A08C044E 05 04                       LSL     R5, R0, #0x10
  22. A08C0450 2D 0C                       LSR     R5, R5, #0x10
  23. A08C0452 33 F2 CF FF                 BL      sub_A0AF43F4
  24. A08C0456 00 28                       CMP     R0, #0
  25. A08C0458 07 D0                       BEQ     loc_A08C046A
  26. A08C045A 33 F2 DF FF                 BL      sub_A0AF441C
  27. A08C045E 02 28                       CMP     R0, #2
  28. A08C0460 01 D1                       BNE     loc_A08C0466
  29. A08C0462 18 34                       ADD     R4, #0x18
  30. A08C0464 01 E0                       B       loc_A08C046A
  31. A08C0466             ; 哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?
  32. A08C0466
  33. A08C0466             loc_A08C0466                            ; CODE XREF: GetSignIconID+30j
  34. A08C0466 1F 4C                       LDR     R4, =word_A0A318B2
  35. A08C0468 0C 34                       ADD     R4, #0xC
  36. A08C046A
  37. A08C046A             loc_A08C046A                            ; CODE XREF: GetSignIconID+28j
  38. A08C046A                                                     ; GetSignIconID+34j
复制代码

从上面那个GetNetSignValue那个函数入手,经过一个Thunk后,到达:
  1. A00EEADC
  2. A00EEADC             sub_A00EEADC                            ; CODE XREF: GetNetSignValue+4j
  3. A00EEADC                                                     ; DATA XREF: GetNetSignValue:off_A0A2D604o
  4. A00EEADC 4F 48                       LDR     R0, =0xA86F0BB0  ;这个地址加8就是。
  5. A00EEADE 80 68                       LDR     R0, [R0,#8]
  6. A00EEAE0 70 47                       BX      LR
  7. A00EEAE0             ; End of function sub_A00EEADC
  8. A00EEAE0
复制代码

这里面的0xA86F0BB0,系统从它加8那里得到信号值。

完成了,天气太热了,不想抓图了!

RepSP.rar

32.63 KB, 下载次数: 100

替换运营商标志为自定义字串V2.1源文件

发表于 2005-8-15 00:01:00 | 显示全部楼层
支持楼主分享你的源文件..
这对学习补丁的移值有很大的帮助..
回复 支持 反对

使用道具 举报

发表于 2005-8-15 00:02:00 | 显示全部楼层
文章是不是还没有完吧??
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-15 00:03:00 | 显示全部楼层
在继续中!!!!!!!!!!
回复 支持 反对

使用道具 举报

发表于 2005-8-15 00:04:00 | 显示全部楼层
现在对补丁的运作已经有一点了解,
但想提几个问题.....对于补丁需要调用一些数据,而在其它机型应该如果找到相应的地址,
之前读者过一些关于移值补丁的帖,,知道可以从"特征码"入手....可不可以..提供一些"特征码"出来呢..
每一种机型的地址应该都不同吧...
特别是..A8xxxxxx.这一类..在RAM中的地址......
回复 支持 反对

使用道具 举报

发表于 2005-8-15 00:05:00 | 显示全部楼层
.....汗自己一个....看半天keil,不知道怎么用呢.
回复 支持 反对

使用道具 举报

发表于 2005-8-15 00:06:00 | 显示全部楼层
....知道怎么用了....半天才发现.....
回复 支持 反对

使用道具 举报

发表于 2005-8-15 00:07:00 | 显示全部楼层
一个小建议
#ifdef S6CV50
//for system function
const GETDATETIME getdate         = (GETDATETIME)0xA0AA6A53;
const GETWEEK getweek                 = (GETWEEK)0xA082AD87;
const GetAkku getakku                 = (GetAkku)0xA1254830;
const f_uint2str uint2str         = (f_uint2str)0xA0825687;
//const DWMODDW dwmoddw         = (DWMODDW)0xA160948C; //because Keil's problem

//for system data with Absolute Location.
word Akkpct __at 0xA863FF08;
word net         __at 0xA86F0BB8;
#endif

这种方法建议换成
#ifdef S6CV50
#include "S6CV50.h"
#endif

这样做的方法好处在
1. 在此基础上做多机型多版本移植时代码显得比较干净
2. 在S6Cv50.h中维护所有的地址即可,不用每次都根据程序所需的函数进行复制粘贴(在ADS中不会把多余无用的地址编译到目标中,Keil没试过,应该也不会吧)
3. 在手机版本升级后也方便根据该头文件更新
回复 支持 反对

使用道具 举报

发表于 2005-8-15 00:08:00 | 显示全部楼层
老大..想问一下..为什么生成的补丁会有
0x800078: 00000000000000000000000000000000
这样的一行??是由什么引起的??这应该要怎么去掉呢??
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-15 00:09:00 | 显示全部楼层
原帖由 ShineGood 于 2005-6-24 09:47 发表
一个小建议

这种方法建议换成

这样做的方法好处在
1. 在此基础上做多机型多版本移植时代码显得比较干净
2. 在S6Cv50.h中维护所有的地址即可,不用每次都根据程序所需的函数进行复制粘贴(在ADS中不会把多 ...

这个建议很好,开发时没有考虑这个问题。下次再发这些东西时会改过来!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-15 00:10:00 | 显示全部楼层
原帖由 devil_997 于 2005-6-24 09:47 发表
老大..想问一下..为什么生成的补丁会有
0x800078: 00000000000000000000000000000000
这样的一行??是由什么引起的??这应该要怎么去掉呢??

那个是因为一些对齐规则引起的,不用管它,不要过于在乎这一点空间!
回复 支持 反对

使用道具 举报

发表于 2005-8-15 00:11:00 | 显示全部楼层
问:
是怎么从工模的ACCU菜单 找到getakku  uint2str 和电池的百分比容量函数的?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-15 00:12:00 | 显示全部楼层
找到ACCU菜单是通过他的显示的字符串。看了一下程序后发现,它是预先写好了整个字符串包括为数字预留的位置,使用的时候copy到buffer中,然后填充每一个位置。从这个发现了getakku函数,和uint2str函数,后面的memcpy是早就找到过的。百分比容量那个你找一下他在cap后面添的内容就知道了。
回复 支持 反对

使用道具 举报

发表于 2005-8-15 00:13:00 | 显示全部楼层
呵呵!好东东!学习学习!
回复 支持 反对

使用道具 举报

发表于 2005-8-15 00:14:00 | 显示全部楼层
keil还需要设置什么?我没法编译。提示
--- Error: can't execute 'ARM-ELF-AS'
(用楼主的项目文件打开)
回复 支持 反对

使用道具 举报

发表于 2005-12-16 09:49:54 | 显示全部楼层
学习  学习  努力学习!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员 微信登录

本版积分规则

小黑屋|Archiver|手机版|爱技术 ( 沪ICP备08115260号-3 )

GMT+8, 2024-5-8 09:14

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表