手臂矢量 table 指向后一个字节

arm vector table pointing one byte after

我有一个小应用程序可以在我的 ARM Cortex M4 上编译和运行良好。但是当我反汇编二进制文件时,我刷新了,这里是第一个字节的样子:

00000000 <.data>:
  0:   20020000        andcs   r0, r2, r0
  4:   080003b5        stmdaeq r0, {r0, r2, r4, r5, r7, r8, r9}
  8:   08000345        stmdaeq r0, {r0, r2, r6, r8, r9}
  c:   08000351        stmdaeq r0, {r0, r4, r6, r8, r9}

080003b5 应该是 Reset handler 的地址(我有 .word Reset_Handler ),但是反汇编 ELF 显示 Reset handler 实际上位于 080003b4,也就是前面 1 个字节:

080003b4 <Reset_Handler>:
  80003b4:  2100        movs    r1, #0
  80003b6:  e003        b.n 80003c0 <InitData>

(在 THUMB 模式下是 运行,我有 2 个字节的指令)。

即使我反汇编二进制文件,它位于 080003b4:

000003b4 <.data+0x3b4>:
  3b4:   2100            movs    r1, #0
  3b6:   e003            b.n     0x3c0

我的问题是,为什么它指向后1个字节?这段代码出人意料地适用于实际电路板。即使不反汇编,指令也不应该按2字节对齐吗?地址怎么可能是0x000003b5?

答:ARM用它来切换到THUMB模式。