arm汇编b指令是绝对地址还是相对地址跳转?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了arm汇编b指令是绝对地址还是相对地址跳转?相关的知识,希望对你有一定的参考价值。
指令说明是相对地址跳转,但反汇编看是绝对地址跳转,究竟如何?
1、指令说明:B 指令是最简单的跳转指令。一旦遇到一个 B 指令,ARM 处理器将立即跳转到给定的目标地址,从那里继续执行。注意存储在跳转指令中的实际值是相对当前PC 值的一个偏移量,而不是一个绝对地址,它的值由汇编器来计算(参考寻址方式中的相对寻址)。它是 24 位有符号数,左移两位后有符号扩展为 32 位,表示的有效偏移为 26 位(前后32MB 的地址空间)
2、代码及反汇编:
.globl _start
_start: b start_code--代码,反汇编后如下:
33f80000 <_start>:
33f80000: ea000012 b 33f80050 <start_code>--问题就在此:跳转到33f80050 地址,如果是相对地址,应该是相对于PC计算各偏移,再跳,指令应该类似于: add pc, pc, #20 ,如果是绝对地址跳转,而flash地址是0,ddr地址是33f80000 ,上电启动时,先在flash里运行,执行 b start_code后,不就是跳转到ddr里的33f80050 运行吗?困惑中......,另外还有个困惑,b指令说只能跳转32M空间,如果是绝对地址跳转,不是远远超出了32M了吗?
b label
:
:
label:
mov r1,r2
mov r2,r3
从汇编指令的书写形式上,确实是一条绝对跳转指令,但是实际上汇编在将“B label”这条指令翻译为机器指令的时候,会计算label相对于当前PC的偏移,将这个偏移值放到机器码中,所以实际上,B跳转指令为相对跳转指令。用相对跳转指令就可以编写位置无关的代码。 参考技术A 这个范围的限制呢,是要看指令编码了,B指令的编码是这样的
31..28:条件码
27..25:101
24:是否链接标志
23..0:跳转的地址
地址值呢,只有24位长度,因为ARM指令是字对齐的,最低2位永远为0,所以最大值也就是前后32MB的范围,
不过虽然这条指令是有32MB的限制,但是超出32MB时,也是可以使用的,我们也不知道链接器会把目的块放到哪里,必要时链接器会自动添加一些代码实现长距离的跳转。
所以在实际使用中,不用去管这个32MB的限制,当成一个绝对跳转指令就行了。追问
-----当成一个绝对跳转指令就行了。 -----,对于上面例子,就是跳转到ddr里的33f80050 运行,但这时ddr等还没初始化,也还没搬程序到ddr呀?
追答b只负责跳转,至于目的地址有没有东西,它可不会管~~
参考技术B 你都反汇编了,就可以对着指令表看看ea000012是啥意思啊。b指令最后24位左移两位,去掉个最高位是符号位,就是要跳的地址,但因为预取,所以还要加个8.ea000012后面的0x12左移两位加个8就是下一条指令的地址,就是0x50,你看看你的0x50是不是reset。
32M那个就是因为24位左移两位去掉最高位剩25位,2^25=32M 参考技术C 最近在家看了一部 <我的丑娘>感触很深 挺激动的 世界上母爱是最巨大的 在这里盼望友人们要多孝敬父母 时光关联 就写这多 呵呵,美丽集中营
以上是关于arm汇编b指令是绝对地址还是相对地址跳转?的主要内容,如果未能解决你的问题,请参考以下文章