<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > GNU ARM匯編--(十二)arm匯編指令的B真的那么簡(jiǎn)單嗎?

GNU ARM匯編--(十二)arm匯編指令的B真的那么簡(jiǎn)單嗎?

作者: 時(shí)間:2016-11-26 來(lái)源:網(wǎng)絡(luò ) 收藏

本文引用地址:http://dyxdggzs.com/article/201611/321719.htm

對照匯編和反匯編的結果,一切正常.下面我們來(lái)看看ea00000e是如何表達b10000040 的?

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

ea00000e轉換為二進(jìn)制后:

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(niǎo)跳轉的地址是和PC相關(guān)的,所以這部分代碼是與位置無(wú)關(guān)的.

注意上面等式中的+8與流水線(xiàn)有關(guān).

B和BL的跳轉范圍是+-32MB,24bit的有符號數,也就是-2^23--2^23,即-8MB--8MB,因為有那個(gè)<<2,所以就是+-32MB了.

可以再看一個(gè)例子:

代碼如下:

[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

結合官方文檔和兩個(gè)實(shí)例,才能真正明白B指令的一些細節.而不是一些中文書(shū)上所說(shuō)的正確的但是表面的內容.

這么深入的分析指令B并不太麻煩,但是arm匯編有很多指令,不可能一一去分析.這里分析指令B,只是因為跳轉指令在bootloader中很重要.而這里給出了一個(gè)方法,如果對LDR這種指令不清楚的話(huà),可以用同樣的方法來(lái)分析.


上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: ARM匯編匯編指

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>