1、汇编启动源码
2、分析二进制:0x0300006f
2.1、反汇编代码
2.2、jal指令
jal指令的作用:跳转到当前PC值偏移offset处执行,其中offset由jal指令的bi[31:12]表示;
2.3、分析指令:j 20030 <reset>
j 20030 //伪指令,跳转到0x20030地址处执行
j reset //伪指令,跳转到reset标号处执行,reset标号的地址就是0x20030
jal x0,0x30 //跳转到当前PC+0x30处执行,PC此时等于0x20000
上面的三条指令是一样的,只是不同的表达方式,j指令是伪指令。
2.4、按照jal指令格式解析0x0300006f
2.5、为什么是当前PC偏移0x30?
3、疑问:写汇编指令和直接写指令的二进制的优劣?
3.1、全志SDK包里的汇编启动代码
全志SDK里是通过代码来构建出jal跳转指令,相较于韦东山老师写的0x0300006f要更灵活,可以根据启动代码的头来动态计算出偏移量;而韦东山老师写的代码,头的大小只能是0x30字节。
3.2、为什么要写跳转指令的二进制,而不是汇编代码?
我认为直接用伪代码:j reset,让编译器去构建jal指令不是更方便吗?代码可读性也更高,不是很理解直接写二进制的方式,但是看到全志的SDK官网代码也是这么写的,是我没有领悟到这样写的好处吗?有知道答案的博友,欢迎在评论区交流。