首先,让我们详细分析一下“方法1”的操作。
在flash的0x0800 0000的开头位置设置编译器,意味着要下载程序并编译程序()
2 .编译程序后,在项目目录的output文件夹中找到编译后生产的. hex文件
在notepad或UltraEdit中打开程序. hex文件
hex文件格式:
(1)以行为单位,每行以冒号开始,内容全部为十六进制代码(用ascii码表示) )。
)2)在HEX文件中,每行表示一个记录。 的基本格式如下。
冒号
本行数据长度
本行数据开头地址
数据类型
数据
校验码
1 byte
2字节
1 byte
n byte
1 byte
第一个字节表示行中数据的长度。
第2、3字节表示本行数据的起始地址;
第4字节表示数据类型,数据类型为0x00、0x01、0x02、0x03、0x04、0x05。
' 00' Data Rrecord :用于记录数据,HEX文件中的大部分记录都是数据记录
' 01' End of File Record:用于标识文件的结尾,位于文件的结尾,用于标识HEX文件的结尾
' 02 '用于标识扩展段地址的记录
' 03 ' startsegmentaddressrecord :段地址记录开始
' 04 ' extendedlinearaddressrecord :用于标识扩展线性地址的记录
' 05 '开始记录startlinearaddressrecord :线性地址
然后在数据中,最后一个字节是校验和。
校验和算法是计算校验和之前所有十六进制代码的累积和(无进位),校验和=0x100 -累积和
.打开hex的内容如下。 (中间部分的数据省略) )。
:020000040800F2
:1000000 b 80 b 00207 d 250008850300088703000841
:100010009 b 0300089 f 030008 a 303000800000 e 2
:1000200000000000000000000000000000000000000000000 a 703000000000000000000000000000 a
:10003000 a 9030008000000 ab 030008 ad 0300089 e。。
:102 b 4000040000000000000000000000000081
:102 b 50000000000000075
:102 b 6000010203040102030406070809020406081 f
:102 b 7000000366 e 01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
:042B80000607080933
:0400000508000121CD
:00000001FF
首先分析第一句---- “:02 0000 04 0800 F2”
冒号
本行数据长度
行数据起始地址(偏移地址) ) )。
数据类型
数据
校验码
1 byte
2字节
1 byte
n byte
1 byte
:
02
0000
04
0800
F2
上面数据类型之后的两种记录(04,05 )用于提供地址信息。 每次碰到这两个记录时,都可以根据记录计算出一个“基”地址。 对于后面的数据记录,计算地址时将基于这些“基本”地址。 以我们的话为例:
第一条记录的长度为02,LOAD OFFSET为0000,RECTYPE为04,表示该记录是扩展段地址记录。 数据为0800,校验和为F2。 根据该记录的长度和数据,[0x080016]=0x08000000,以后的数据记录可以计算以该地址为基地址的基地址。
第二条文--- " 336010000000 b 80 b 00207 d 250008850300088703000841 "
冒号
本行数据长度
行数据起始地址(偏移地址) ) )。
数据类型
数据
校验码
1 byte
2字节
1 byte
n byte
1 byte
:
10
0000
00
B 80 b 00207 d 2500088503000887030008
41
第一
2
记录的长度为
10(0x10=16字节) ) ) )。
,
负载偏移
,来定义您自己的自订外观
0000
,
RECTYPE
,来定义您自己的自订外观
00(00 ) datarrecord :用于记录数据,HEX文件的大部分记录是数据记录。)
,数据为b 80 b 00207 d 2500088503000887030008
校验码为41; 此时基地址偏移为0x0800 0000的地址:0x0000这一记录的16字节的数据的开头地址为0x0800000 0x0000=0x0800 0000
第3条语句----“:0400000508000121CD”
冒号
本行数据长度
行数据起始地址(偏移地址) ) )。
数据类型
数据
校验码
1 byte
2字节
1 byte
n byte
1 byte
:
04
0000
05
08000121
CD
记录的长度为
04
,
负载偏移
,来定义您自己的自订外观
0000
,
RECTYPE
,来定义您自己的自订外观
05、此时,存储在EIP寄存器中的地址:0x0800 0121; 也就是说,IP指向包含要执行的下一个命令的地址。 让我们看看IAP工程list目录下的. map文件。 第393行应为: (
没有吗?0x0800 0121值main函数的入口地址)
EIP是32位机器的指令寄存器,IP是指令寄存器,用于存储当前指令的下一条指令的地址。 IP指示CPU应该执行哪个指令
上图请参考hex数据文档。 http://pages.interlog.com/~ sp eff/useful info/hexfrmt.pdf或http://microsym.com/editor/asets/Intel hex
第4条---“:00000001FF”(每个. hex文件的最后一行固定在此内容中) )。
冒号
本行数据长度
行数据起始地址(偏移地址) ) )。
数据类型
数据
校验码
1 byte
2字节
1 byte
n byte
1 byte
:
00
0000
01
FF
(每个. hex文件的最后一行固定为此内容。)
记录的长度为
00
,
负载偏移
,来定义您自己的自订外观
0000
,
RECTYPE
,来定义您自己的自订外观
01
(
01' End of File Record:用于标识文件的结尾,位于文件的结尾,用于标识HEX文件的结尾。)