新闻中心

EEPW首页>嵌入式系统>设计应用> GNU ARM汇编--(十二)arm汇编指令的B真的那么简单吗?

GNU ARM汇编--(十二)arm汇编指令的B真的那么简单吗?

作者: 时间:2016-11-26 来源:网络 收藏

本文引用地址://m.amcfsurvey.com/article/201611/321719.htm

对照汇编和反汇编的结果,一切正常.下面我们来看看ea00000e是如何表达b10000040 的?

31 28 27 26 25 24 23 0
cond 1 0 1 L signed_immed_24

ea00000e转换为二进制后:

31 28 27 26 25 24 23 0
1110 1 0 1 0 0x00000e

cond是1110,即是条件执行的ALL,L为0表示指令是B,不是BL.signed_immed_24值为0x00000e.

signed表示有符号数.所以0x00000e就是+15,按照上图的规则:

0x10000000+14<<2+8 = 0x10000040

这里的0x10000000等地址都是VMA(虚拟内存地址),而B跳转的地址是和PC相关的,所以这部分代码是与位置无关的.

注意上面等式中的+8与流水线有关.

B和BL的跳转范围是+-32MB,24bit的有符号数,也就是-2^23--2^23,即-8MB--8MB,因为有那个<<2,所以就是+-32MB了.

可以再看一个例子:

代码如下:

[cpp]view plaincopy
  1. ledloop:
  2. ldrr1,=0x1c0
  3. strr1,[r2]
  4. bldelay
  5. ldrr1,=0x1a0
  6. strr1,[r2]
  7. bldelay
  8. ldrr1,=0x160
  9. strr1,[r2]
  10. bldelay
  11. ldrr1,=0x0e0
  12. strr1,[r2]
  13. bldelay
  14. bledloop


反汇编结果如下:

[cpp]view plaincopy
  1. 100002f0 :
  2. 100002f0:e3a01d07movr1,#448;0x1c0
  3. 100002f4:e5821000strr1,[r2]
  4. 100002f8:ebffffadbl100001b4
  5. 100002fc:e3a01e1amovr1,#416;0x1a0
  6. 10000300:e5821000strr1,[r2]
  7. 10000304:ebffffaabl100001b4
  8. 10000308:e3a01e16movr1,#352;0x160
  9. 1000030c:e5821000strr1,[r2]
  10. 10000310:ebffffa7bl100001b4
  11. 10000314:e3a010e0movr1,#224;0xe0
  12. 10000318:e5821000strr1,[r2]
  13. 1000031c:ebffffa4bl100001b4
  14. 10000320:eafffff2b100002f0


同样的:0x10000320+8+(-14)<<2 = 0x1000002f0

结合官方文档和两个实例,才能真正明白B指令的一些细节.而不是一些中文书上所说的正确的但是表面的内容.

这么深入的分析指令B并不太麻烦,但是arm汇编有很多指令,不可能一一去分析.这里分析指令B,只是因为跳转指令在bootloader中很重要.而这里给出了一个方法,如果对LDR这种指令不清楚的话,可以用同样的方法来分析.


上一页 1 2 下一页

关键词:ARM汇编汇编指

评论


技术专区

关闭