韦东山D1S板子——汇编启动代码第一行分析(.long 0x0300006f)

1、汇编启动源码

韦东山D1S板子——汇编启动代码第一行分析(.long 0x0300006f)_第1张图片

2、分析二进制:0x0300006f

2.1、反汇编代码

韦东山D1S板子——汇编启动代码第一行分析(.long 0x0300006f)_第2张图片

2.2、jal指令

韦东山D1S板子——汇编启动代码第一行分析(.long 0x0300006f)_第3张图片

jal指令的作用:跳转到当前PC值偏移offset处执行,其中offset由jal指令的bi[31:12]表示;

2.3、分析指令:j 20030

j	20030 	//伪指令,跳转到0x20030地址处执行
j 	reset	//伪指令,跳转到reset标号处执行,reset标号的地址就是0x20030
jal x0,0x30	//跳转到当前PC+0x30处执行,PC此时等于0x20000

上面的三条指令是一样的,只是不同的表达方式,j指令是伪指令。

2.4、按照jal指令格式解析0x0300006f

韦东山D1S板子——汇编启动代码第一行分析(.long 0x0300006f)_第4张图片

2.5、为什么是当前PC偏移0x30?

韦东山D1S板子——汇编启动代码第一行分析(.long 0x0300006f)_第5张图片

3、疑问:写汇编指令和直接写指令的二进制的优劣?

3.1、全志SDK包里的汇编启动代码

韦东山D1S板子——汇编启动代码第一行分析(.long 0x0300006f)_第6张图片

全志SDK里是通过代码来构建出jal跳转指令,相较于韦东山老师写的0x0300006f要更灵活,可以根据启动代码的头来动态计算出偏移量;而韦东山老师写的代码,头的大小只能是0x30字节。

3.2、为什么要写跳转指令的二进制,而不是汇编代码?

我认为直接用伪代码:j reset,让编译器去构建jal指令不是更方便吗?代码可读性也更高,不是很理解直接写二进制的方式,但是看到全志的SDK官网代码也是这么写的,是我没有领悟到这样写的好处吗?有知道答案的博友,欢迎在评论区交流。

你可能感兴趣的:(#,东山PI-D1S板子学习笔记,汇编,RISC-V)