说句题外话,在输入“指令”二字的时分,就想起了google查找时,提示“令”不能查找,要我换词汇.假如不能说脏话,我真就无语了.
在前面临详细芯片的各个根本模块做完了学习后,在上一篇小结中自以为现已具有了自己写个bootloader的条件,但其实错了,我还有许多根本的常识不了解.比方编译链接gnu的linker script等等.也有许多当地只懂外表,没有做深化的了解.
在《GNU ARM汇编–(二)汇编编译链接与运转》中,模仿网上的比如做了makefile和linker script,在那篇blog的结尾我写道“依据google,做了上面的总结,对GNU ARM汇编有了知道,并且对体系调用软中止,中止处理,uboot反常向量表等等有了探求的愿望,也对elf格局和编译链接有了爱好,依据自己的方向和精力,后续对这些内容做一个或深或浅的学习.”
其时看到了《linker and loader》,仅仅保存了,其时并没有细看,作为一个程序员,其实许多时分咱们并不明白程序的细节.就像台湾有个黑客关于“hello world”的剖析,最初看了他的”hello world”系列ppt,就发现本来简略的hello world里边有这么多不为人知的细节.
这些天翻看了《linker and loader》的前面几节,也翻了《程序员的自我涵养–链接装载和库》,通读了gnu.org的ld相关文档linker script.自己还对gnu的这个文档的大部分做了翻译,在自己的笔记本上写了许多页,一根笔芯也用了多半,并且让我有了久别写字写到手酸的感觉.觉得收成不少.引荐去看看,值得的.
废话了这么多,这篇blog我倒不想写linker script或许ELF的一些细节.我想深究一下arm汇编指令中的B指令.
许多网上的帖子都讨论过arm汇编指令的B和LDR,这儿我依照我的思路来:
首要翻一下《ARM ArchitectureReference Manual》这份肯定威望的手册:
看完上面的英文,再结合下面的实践比如做个照应:
代码如下:
- _start:breset
- ……
- reset:
- ……
反汇编如下:
- 10000000<_start>:
- 10000000:ea00000eb10000040
- ……
- 10000040
: