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

为何ARM程序入口地址0x800107d与Reset_Handler起始地址0x800107c不匹配?

关于ARM程序入口地址与Reset_Handler地址不匹配的问题解答

这是ARM架构指令集的特性导致的,核心原因如下:

  1. ARM指令集模式标识规则
    ARM架构支持两种指令集:32位ARM指令集(要求地址4字节对齐)和Thumb/Thumb-2指令集(16/32位混合,要求地址2字节对齐)。程序入口地址的最低位是模式标识位,不是实际执行地址的一部分:
  • 最低位为0:CPU以ARM模式执行,实际执行地址就是入口地址本身;
  • 最低位为1:CPU以Thumb模式执行,实际执行地址是入口地址去掉最低位(即与0xFFFFFFFE做按位与运算)。

你这里的入口地址是0x800107d,最低位为1,说明CPU将以Thumb模式执行,实际取指地址是0x800107d & 0xFFFFFFFE = 0x800107c,正好对应Reset_Handler的起始地址。

  1. 0x800107c处指令的执行情况
    0x800107c处的f8df d034是一条32位的Thumb-2指令,CPU会从0x800107c开始完整执行这条4字节的指令,不存在只执行3/4字节的情况。入口地址的最低位仅用于告知CPU指令集模式,不会影响指令的完整取指和执行。

  2. 符号地址与入口地址的差异
    arm-none-eabi-objdump显示的Reset_Handler地址是实际的内存对齐地址(符合Thumb指令集的2字节对齐要求),而arm-none-eabi-readelf显示的入口地址是包含模式标识的地址,这是ARM架构下的标准行为,两者本质指向的是同一段可执行代码。

内容的提问来源于stack exchange,提问作者jack wen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:52:44