GNU ARM匯編--(十二)arm匯編指令的B真的那么簡(jiǎn)單嗎?
在前面對具體芯片的各個(gè)基本模塊做完了學(xué)習后,在上一篇小結中自以為已經(jīng)具備了自己寫(xiě)個(gè)bootloader的條件,但其實(shí)錯了,我還有很多基本的知識不了解.比如編譯鏈接gnu的linker script等等.也有很多地方只懂表面,沒(méi)有做深入的理解.
本文引用地址:http://dyxdggzs.com/article/201611/321719.htm在《GNU ARM匯編--(二)匯編編譯鏈接與運行》中,仿照網(wǎng)上的例子做了makefile和linker script,在那篇blog的末尾我寫(xiě)道“根據google,做了上面的總結,對GNU ARM匯編有了認識,并且對系統調用軟中斷,中斷處理,uboot異常向量表等等有了探究的欲望,也對elf格式和編譯鏈接有了興趣,根據自己的方向和精力,后續對這些內容做一個(gè)或深或淺的學(xué)習.”
當時(shí)看到了《linker and loader》,只是保存了,當時(shí)并沒(méi)有細看,作為一個(gè)程序員,其實(shí)很多時(shí)候我們并不懂程序的細節.就像臺灣有個(gè)黑客關(guān)于“hello world”的分析,當初看了他的"hello world"系列ppt,就發(fā)現原來(lái)簡(jiǎn)單的hello world里面有這么多不為人知的細節.
這些天翻看了《linker and loader》的前面幾節,也翻了《程序員的自我修養--鏈接裝載和庫》,通讀了gnu.org的ld相關(guān)文檔linker script.自己還對gnu的這個(gè)文檔的大部分做了翻譯,在自己的筆記本上寫(xiě)了好多頁(yè),一根筆芯也用了大半,而且讓我有了久違寫(xiě)字寫(xiě)到手酸的感覺(jué).覺(jué)得收獲不少.推薦去看看,值得的.
廢話(huà)了這么多,這篇blog我倒不想寫(xiě)linker script或者ELF的一些細節.我想深究一下arm匯編指令中的B指令.
很多網(wǎng)上的帖子都討論過(guò)arm匯編指令的B和LDR,這里我按照我的思路來(lái):
首先翻一下《ARM ArchitectureReference Manual》這份絕對權威的手冊:
看完上面的英文,再結合下面的實(shí)際例子做個(gè)呼應:
代碼如下:
- _start:breset
- ......
- reset:
- ......
反匯編如下:
- 10000000<_start>:
- 10000000:ea00000eb10000040
- ......
- 10000040
:
評論