手臂矢量 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模式。
我有一个小应用程序可以在我的 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模式。