当前位置: 首页 > news >正文

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

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官网代码也是这么写的,是我没有领悟到这样写的好处吗?有知道答案的博友,欢迎在评论区交流。

http://www.lryc.cn/news/209322.html

相关文章:

  • 了解单域名证书和通配符证书的区别,选择合适的SSL证书解决方案
  • 【LeetCode】7. 整数反转
  • 防止请求重复提交:注解+拦截器的实现方案
  • C#使用mysql-connector-net驱动连接mariadb报错
  • SpringBoot 定时任务:@EnableScheduling @Scheduled
  • Jquery 如何获取子元素。如何找到所有 HTML select 标签的选中项。jQuery 里的 ID 选择器和 class 选择器有何不同
  • Python Selenium 之数据驱动测试的实现!
  • 【Proteus仿真】【STM32单片机】智能语音家居陪护机器人
  • C#上位机序列10: 批量读写+点对点更新+数据类型处理
  • MySQL 概述 数据库表操作 数据增删改
  • 存储器概述
  • Fabric.js 使用自定义字体
  • 【C++项目】高并发内存池第七讲性能分析
  • 【JavaScript】快速学习JS
  • 控制输入流,从控制台打印到文件中,更改输出的位置
  • 计算线阵相机 到 拍摄产品之间 摆放距离?(隐含条件:保证图像不变形)
  • 【网络】详解http协议
  • 1819_ChibiOS的互斥信号与条件变量
  • CSDN学院 < 华为战略方法论进阶课 > 正式上线!
  • 电商接口api数据比价接口推荐
  • 读取Excel的工具类——ExcelKit
  • vscode连接服务器一直retry
  • Spring Cloud Sentinel整合Nacos实现配置持久化
  • STM32F4VGT6-DISCOVERY:uart1驱动
  • C语言之 结构体,枚举,联合
  • 红米电脑硬盘剪切
  • 微信小程序在线预览PDF文件
  • Android 工厂模式增加Type-A功能测试
  • Web攻防06_sqlmap的使用
  • C++模拟实现-----日期计算器(超详细解析,小白一看就会!)