使用Python修改IntelHex文件起始地址未生效求助
解决IntelHex扩展地址记录修改问题
你混淆了Intel Hex里两种不同的记录类型:
- 你首行的
:0200000480007A是扩展线性地址记录(类型04),作用是指定后续数据所在地址空间的高16位,和程序的起始执行地址无关。 start_addr属性控制的是起始地址记录(类型01/05),对应程序CPU开始执行的入口地址,这类记录通常在文件末尾。
所以修改start_addr自然不会改变首行的04类型记录。要修改首行的扩展地址,需要直接操作04类型的记录,步骤如下:
代码示例
from intelhex import IntelHex # 读取原文件 hx = IntelHex() hx.fromfile('copy.hex', format='hex') # 删除所有已存在的04类型扩展线性地址记录 for addr in list(hx.addresses()): rec = hx.get_record(addr) if rec['type'] == 4: hx.delete(addr, addr + rec['length'] - 1) # 设置新的高16位地址(比如改成0x9000,对应地址空间0x90000000-0x9000FFFF) new_high_addr = 0x9000 # 04类型记录的地址字段固定为0x0000,数据是2字节的高地址 hx.puts(0x0000, new_high_addr.to_bytes(2, byteorder='big')) # 标记该地址段的记录类型为04 hx.set_record_type(0x0000, 4) # 如果需要修改程序执行的起始入口地址(EIP),继续用start_addr hx.start_addr = {'EIP': 2149580800} # 保存修改后的文件 hx.tofile('modified_copy.hex', format='hex')
说明
原首行的:0200000480007A各字段含义:
02:数据长度(2字节)0000:记录地址(04类型记录固定为0x0000)04:记录类型(扩展线性地址)8000:高16位地址值7A:校验和
执行上述代码后,新生成的文件首行会变成对应新地址的04类型记录,校验和也会自动计算生成。
内容的提问来源于stack exchange,提问作者Aaryan
相关产品推荐
相关产品推荐

