为什么入口点地址是0x800107d,但第一条指令开始于0x800107c

jac*_*wen 1 embedded arm gnu stm32 cortex-m

使用arm-none-eabi-readelf -h ideself.elf可以找到:

Entry point address:               0x800107d
Run Code Online (Sandbox Code Playgroud)

使用arm-none-eabi-objdump -D ideself.elf可以找到:

0800107c <Reset_Handler>:                       
 800107c:   f8df d034   ldr.w   sp, [pc, #52]   ; 80010b4 <LoopForever+0x2>
 8001080:......................................................
Run Code Online (Sandbox Code Playgroud)

为什么启动reset_handler不等于0x800107d而不是0x800107c

0x800107c 中的字节不执行?执行 3/4 四字节指令 ?

the*_*bee 5

ARM 处理器有两种不同的指令集:Thumb 和 ARM。Thumb 指令集每条指令有 16 位,ARM 指令集每条指令有 32 位。指令在内存中对齐。

因此,指令指针的值是偶数,这意味着指令地址的位 0 是 0。这使得该位“可以自由使用”用于其他目的。

因此,处理器根据目标地址的位 0 决定是继续处于 Thumb 模式还是 ARM 模式。位 0 = 1 将处理器切换到 Thumb 模式,从而产生奇数目标地址。然而,实际指令的地址仍然是偶数,并且少了一位。