You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 16:01:32