理论学习-ARM-内核

ARM内核

  • 函数的调用
  • 加载、存储
  • 计算
  • 中断
  • 异常
  • 线程的切换

为了提高学习效率,我们要提前想好学习策略。
首先,使用频率越高的知识点,越要首先学习。假使,我们学习了一个知识点,能覆盖工作中80%的工作量,那是不是很夸张的学习效率?!
其次,有两种覆盖知识点,梳理知识点的策略。一种是将知识按体系划分,挨个学习,系统学习。具体而形象的学习样板就是教科书。第一章,第二章等等,挨个分支学习、梳理。如果我们要讲述应题的知识,就要按寄存器、计算机工作原理、汇编指令、内核架构分体系去挨个讲解。还有一种策略就是面对问题。比如,我们首先提出一个问题:“函数调用,从C语言到汇编,再到CPU内核,以及寄存器的工作表现是怎样实现的”,如果我们把这个问题讲解清楚,就要把各个牵涉的体系知识揉到一起讲解。第二种策略,似乎更能把使用频率高的知识点串一起,一起学习。是我们面对工程应用更好的学习策略。因为我们不是做研究啊!如果,我们用第二种工作策略,感觉收益不大了(因为使用频率低的,这种学习方式我们不易接触到,无法高效率补充知识盲点)。那么我们就应该更换第一中学习策略了,补充知识盲点,系统学习,系统梳理。

ok,我们采用第二种策略开始学习。

函数的调用

要实现函数调用,有至少要有四步:

  1. 压栈,保护当前函数现场。
  2. 跳转,实现函数跳转。
    a. 读参数
    b. 运算、运行
    c. 返回结果
  3. 跳转,返回父级函数。
  4. 出栈,恢复现场。

用实例,来对应感受一下。
在这里插入图片描述
对应的汇编
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可见,套路既是:
5. 压栈,保护当前函数现场。 { PUSH 或者 LDR } sp寄存器,Rx寄存器
6. 跳转,实现函数跳转。{B、BL、BX},对应给PC寄存器赋值
a. 读参数 (出栈【从栈读取】、或者R0、R1)
b. 运算、运行 (ADD等)
c. 返回结果(压栈【从栈保存】,或者R0、R1)
7. 跳转,返回父级函数。{B、BL、BX ,但对应LR}, 对应给PC寄存器赋值
8. 出栈,恢复现场。{POP 或者LDR}, sp寄存器,Rx寄存器

【注意】:

  1. 跳转前保存下一条指令地址至LR寄存器
    不带返回的跳转指令B, 不会保存地址至LR寄存器
    带返回的跳转指令BL,会自动保存地址至LR寄存器
  2. 在子函数不会自动跳回父函数,需要手动将LR寄存器的值赋给PC寄存器才能跳转回来

加载、存储

计算

中断

异常

线程的切换

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/693804.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习基础(四)非监督学习的进阶探索

导语:上一节我们详细探索监督学习的进阶应用,详情可见: 机器学习基础(三)监督学习的进阶探索-CSDN博客文章浏览阅读296次,点赞13次,收藏11次。监督学习作为机器学习的一个主要分支,…

【C++】vector模拟实现+迭代器失效

vector模拟实现 成员变量定义默认成员函数构造函数 迭代器范围for、对象类型匹配原则 容量操作sizeemptycapacityreserve成员变量未更新memcpy值拷贝 resize内置类型的构造函数 数据访问frontbackoperator[ ] 数据修改操作push_backpop_backswapclearinsertpos位置未更新无返回…

解决缓存失效导致的数据库压力问题(缓存击穿问题)

问题描述 在软件开发过程中,特别是在使用缓存策略优化数据访问性能时,经常会遇到缓存失效引发的问题。具体来说,在一个服务类BaseDataService中,findData方法负责从数据库拉取数据并缓存。这里使用了expireAfterWrite60s的缓存策…

【Linux】Linux调试器-gdb使用

1. 背景 程序的发布方式有两种,debug模式和release模式 Linux gcc/g出来的二进制程序,默认是release模式 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项 2. 开始使用 gdb binFile 退出: ctrl d 或 quit 调…

新建一个flask项目

在Flask中创建一个新的项目,您可以遵循以下步骤: 确保您已经安装了Python环境。如果还未安装Flask,可以通过pip来安装: pip install flask创建一个新的文件夹作为您的项目文件夹,例如myflaskapp: mkdir …

Java 学习和实践笔记(15):面向过程和面象对象其实很简单!

学完这一节,才真正明白了什么叫面向对象和面向过程,其实很简单~ 第一个例子:怎样把大象装进冰箱 这个很清楚很容易地可以列出第一步。 第二个例子:怎样制造一台汽车 这个就很难确定哪一步做第一步。 面向过程和面向对象的区别 …

echarts折线图单位为Bit/s的数据展示

需求:单位为Bit/s的数据需要换算y轴、legend和tooltip的单位; 显示数据时需要换算单位是因为数据以比特每秒(Bit/s)的形式返回,但是在实际展示中,可能更方便和易读的是使用其他单位,例如Gb/s、M…

8 磁盘存储器的管理

外存的组织方式 连续组织方式:为每一个文件分配一组相邻接的盘块 链接组织方式:多个不连续的盘块 链接指针 隐式链接 显示链接:文件分配表FAT FAT技术: FAT12(512B)、以簇为单位的FAT12文件系统、FAT16、…

笔记:torch.roll

最近在准备写 swin transformer 的文章,记录下 torch.roll 的用法: >>> x torch.tensor([1, 2, 3, 4, 5, 6, 7, 8]).view(4, 2) >>> x tensor([[1, 2],[3, 4],[5, 6],[7, 8]]) 第0维度向下移1位,多出的[7,8]补充到顶部 &g…

【移动开发】iOS平台 Java编译器 Jedona Compiler 评测

上期编译器评测链接: Java Compiler IDE评测 一、使用平台 该编译器(Jedona Compiler)在苹果应用市场App Store中下载,笔者使用iPad进行Java代码编写。 应用市场界面: 二、开发界面介绍 开发界面比较简洁&#xf…

【JGit 】简述及学习资料整理

JGit 介绍 [官网](JGit | The Eclipse Foundation): https://www.eclipse.org/jgit/ 用户指南 : https://github.com/eclipse-jgit/jgit/wiki/User-Guide JGit是一个用于Java编程语言的开源Git实现。它提供了一组Java库和API,使开发人员可以在他们的Java应用程序…

python 与 neo4j 交互(py2neo 使用)

参考自:neo4j的python.py2neo操作入门 官方文档:The Py2neo Handbook — py2neo 2021.1 安装:pip install py2neo -i https://pypi.tuna.tsinghua.edu.cn/simple 1 节点 / 关系 / 属性 / 路径 节点(Node)和关系(relationship)是构成图的基础…

重磅!移远通信正式发布一站式XR产品解决方案,助力探索数字世界新纪元

伴随着以5G、大数据、云计算等现代化信息科技的发展,人类对数字世界、智慧地球的探索更加深入。尤其是以XR(扩展现实)为代表的技术崛起,更让物理世界与虚拟世界中的连接愈发紧密,千行百业也亟待新探索。 近日&#xff…

计算机组成原理(4)-----Cache的原理及相关知识点

目录 1.Cache的原理 2.Cache的性能 3.Cache和主存的映射方式 (1)全相联映射 (2)直接映射 (3)组相联映射 4.替换算法 (1)随机算法(RAND) (2)先进先出算法(FIFO) (3)近期最少使用(LRU) (4)最近不经…

论文阅读:How Do Neural Networks See Depth in Single Images?

是由Technische Universiteit Delft(代尔夫特理工大学)发表于ICCV,2019。这篇文章的研究内容很有趣,没有关注如何提升深度网络的性能,而是关注单目深度估计的工作机理。 What they find? 所有的网络都忽略了物体的实际大小,而关注他们的垂直…

使用 openssl 进行哈希计算

版本&#xff1a;OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022) SHAx 系列 如果对象完全存储在内存中&#xff0c;可以使用以下函数&#xff1a; #include <openssl/sha.h>unsigned char *SHA1(const unsigned char *data, size_t count, unsigned…

C#_WaitAll、WhenAll、async及await

Task.WhenAll、Task.WaitAll Task.WhenAll 和 Task.WaitAll 都是用于等待多个任务完成的方法&#xff0c;但它们之间有一些重要的区别。 返回类型: Task.WhenAll: 返回一个 Task 对象&#xff0c;该对象表示所有输入任务的联合任务。 Task.WaitAll: 没有返回值。它是一个同步方…

WEB APIs (4)

日期对象 实例化 代码中出现new关键字&#xff0c;创建时间对象 得到当前时间&#xff1a; const date new Date&#xff08;&#xff09; 获得指定时间&#xff1a; const date new Date&#xff08;‘2022-5-1’&#xff09; 方法作用说明getFullYear()获取年份获取…

前端算法题——字符串中的第一个唯一字符

前言 给定一个字符串&#xff0c;找到它的第一个不重复的字符&#xff0c;并返回它的索引。如果不存在&#xff0c;则返回 -1。 示例&#xff1a;s "leetcode" 返回 0s "loveleetcode" 返回 2// 提示&#xff1a;你可以假定该字符串只包含小写字母思路…

搜索专项---DFS之连通性模型

文章目录 迷宫红与黑 一、迷宫OJ链接 本题思路:DFS直接搜即可。 #include <iostream> #include <cstring> #include <algorithm>constexpr int N110;int n; char g[N][N]; bool st[N][N]; int x1, y1, x2, y2;int dx[4] {-1, 0, 1, 0}, dy[4] {0, 1, 0, …