【发布时间】:2016-11-28 10:19:55
【问题描述】:
我有一个在我的 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 需要对齐的指令地址,所以
080003b5肯定是不正确的。但最低有效位可能用于拇指/full32 模式标记(您的地址可能意味着重置处理程序是080003b4处的“拇指”代码),不记得它是如何从头开始的,我不会去检查 CPU 文档,所以把 is 作为一个模糊的提示,这可能是完全错误的。 -
这里已经以各种形式问过很多次了,随意搜索最合适的副本(我现在没有时间)。简而言之,请阅读 Thumb 符号/代码地址在互通方面的工作原理。
-
使用跳转指令时,B需要知道是跳转到Thumb指令还是ARM指令,奇地址是让它知道是Thumb。 LSBit 在获取跳转地址时无论如何都会被忽略。
标签: c++ assembly linker arm thumb