看linux内核启动流程需要的arm汇编学习笔记(二)

文章目录

  • 一、ldr
    • 1.地址偏移模式
    • 2.变基模式
    • 3.标签
      • 3.1 访问宏定义
      • 3.2 访问一个字符串
      • 3.3 访问一个data
  • 二、ldp和stp
    • 1.双字节加载
    • 2.双字节存储
    • 3.双字节存储的后变基模式
  • 三、位操作
    • 1. 移位
    • 2. 按位操作
    • 3. 位段插入
    • 4.位段提取
    • 5.零计数指令
  • 四、跳转指令
    • 1. cmp比较两个数
    • 2. cmn负向比较
  • 五、 条件选择指令
    • 1. csel:条件选择指令
    • 2. cset:条件置位指令
    • 3. csinc:条件选择并增加指令

一、ldr

1.地址偏移模式

/* 读取0x80000地址的值到x0寄存器*/
ldr x0, [x1]/* 读取0x80008地址的值*/
ldr x2, [x1, #8]/* 读取x1+x3 地址的值*/
ldr x4, [x1, x3]/* 读取(x1+ x3<<3) 地址的值*/
ldr x5, [x1, x3, lsl #3]

2.变基模式

/* 前变基模式:先更新偏移地址再访问内存 */
/* 先更新x1的值为X1+8,然后以新的X1值为地址,加载内存的值到x0 */
ldr x6, [x1, #8]!/* 后变基模式:先访问内存地址再更新偏移地址  */
/* 以X1的值为地址,加载该内存地址的值到X0,然后再更新X1寄存器为X1+8*/
ldr x7, [x1], #8

3.标签

3.1 访问宏定义

#define my_label 0x30
ldr x0, =my_label  /*把宏的值加载到x0寄存器*/
ldr x1, my_label   /* PC值 + 宏的值,然后加载这个地址的值到x1寄存器*/

3.2 访问一个字符串

.globl string1
string1:.string "Boot at EL"ldr x0, string1  /*加载string1的ASCII码的值到x0,加载8个字节的数据*/
ldr x1, =string1 /*加载string1的地址到x1寄存器。若读取地址的值,可以得到string1的ascii*/

3.3 访问一个data

.align 3
.globl my_data
my_data:.word 0x44ldr x0, my_data  /*加载mydata的值到x0*/
ldr x1, =my_data  /*加载mydata的地址到x1*/

二、ldp和stp

1.双字节加载

//以X0的值为地址,加载此地址的值到x3寄存器,以x0+8为地址,加载此地址的值到X7寄存器
ldp x3,x7,[x0] 

2.双字节存储

//存储X1的值到地址为X4的内存中,然后存储x2的值到地址为X4+8的内存中。
STP X1,X2,[X4]

3.双字节存储的后变基模式

将寄存器 x1 的值存储到由 x0 指向的内存地址开始的位置。紧接着将寄存器 x2 的值存储到紧接着 x1 存储位置之后的内存地址。存储完成后,更新 x0 寄存器的值,使其增加 16 个字节。

stp x1, x2, [x0], #16

三、位操作

1. 移位

指令名字含义
lsl逻辑左移将寄存器中的每一位向左移动指定的位数,左边空出的位用 0 填充。
lsr逻辑右移将寄存器中的每一位向右移动指定的位数,右边空出的位用 0 填充。
asr算术右移将寄存器中的每一位向右移动,但会保留被移出的最高位(符号位),并用它来填充空出的位
ror循环右移将寄存器中的每一位向右移动,右边移出的数据用来回填最左边的空位

在这里插入图片描述

逻辑右移和算术右移的区别?

2. 按位操作

  1. AND: 执行逻辑与操作。
    and <destination>, <source1>, <source2>
    
  2. EOR (Exclusive OR): 执行逻辑异或操作。
    eor <destination>, <source1>, <source2>
    
  3. ORR (Bitwise OR): 执行逻辑或操作。
    orr <destination>, <source1>, <source2>
    
  4. BIC (Bit Clear): 执行逻辑非操作后与另一个操作数进行与操作,用于清除特定位。
    bic <destination>, <source1>, <source2>
    

3. 位段插入

   BFI Xd,Xn,#lsb,#width

BFI:位段插入指令。用Xn中的bit[0:width-1]替换Xd中从lsb开始的width位,Xd其他位不变。
例子:使用bfi指令把0x345中的低4位插入到x0寄存器的第八位开始的4位中

mov x1, 0x345
mov x0, 0
bfi x0, x1, 8, 4

4.位段提取

  UBFX Xd,Xn,#lsb,#widthSBFX Xd,Xn,#lsb,#width

UBFX:无符号数的位段提取指令
SBFX:有符号数的位段提取指令
从Xn寄存器提取位段,位段从第lsb位开始,位宽为width,然后结果写入到Xd寄存器的最低比特位中。UBFX指令不做符号位的扩展,其他比特位是填充0;SBFX会对有符号位进行扩展,即当提取的位段中,最高位为1时,那么其他比特位会填充为1。
例子:

/*提取x2,从第4个bit开始,提取8bit。x3其他位都是0,最终:0xbc*/
ldr x2, =0x5678abcd
ubfx x3, x2, #4, #8/*提取x2,从第4个bit开始,提取8bit。x4的其他比特位都是f, 最终:0xffffffffffffffbc*/
sbfx x4, x2, #4, #8

5.零计数指令

clz Xd,Xn

CLZ指令会扫描Xn寄存器中的位,从最高位开始计数,直到遇到第一个非零位。计数的结果(即零的数量)会被存储在Xd寄存器中。如果在最高位就遇到非零位,CLZ 指令会返回 0,因为没有任何零位。

例子:

ldr x1, =0x0fffffffffffffff
clz x2, x1

x2的结果为4

四、跳转指令

1. cmp比较两个数

/*相当于x1-x2*/
cmp x1,x2

2. cmn负向比较

/*相当于x1+x2*/
cmn x1,x2

然后查看NZCV位判断结果:

条件后缀含义标志条件码
EQ相等Z=10b0000
NE不相等Z=00b0001
CS/HS无符号数大于或者等于C=10b0010
CC/LO无符号数小于C=00b0011
MI负数N=10b0100
PL正数或零N=00b0101
VS溢出V=10b0110
VC未溢出V=00b0111
HI无符号数大于(C=1)&&(Z=0)0b1000
LS无符号数小于或等于(C=0)||(Z=1)0b1001
GE带符号数大手或等于N=V0b1010
LT带符号数小于N!=V0b1011
GT带符号数大于(Z=0)&&(N=V)0b1100
LE带符号数小于或等千(Z=1)||(N!=V)0b1101
AL无条件执行-0b1110
NV无条件执行-0b1111

例子:

1:cmn x1, x2add x2, x2, 1/*查看NZCV操作后缀*/mrs x0, nzcv/*mi: 负数*/b.mi 1b/*测试CMP指令*/mov x2, 3
2:cmp x2, x1add x1, x1, 1/*查看NZCV操作后缀*/mrs x0, nzcv/*cs: 无符号数大于等于*/b.cs 2b

五、 条件选择指令

1. csel:条件选择指令

csel Xd,Xn,Xm,cond

如果cond为真,Xd=Xn,否则Xd=Xm。

2. cset:条件置位指令

cset Xd,cond

如果cond为真,Xd=1,否则Xd=0。

3. csinc:条件选择并增加指令

csinc Xd,Xn,Xm,cond

如果cond为真,Xd=Xn,否则Xd=(Xm+1)。

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

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

相关文章

SpringCloud学习(13)-SpringCloudAlibaba-Seata

一、介绍&#xff1a; Seata是阿里巴巴旗下的产品&#xff0c;是一款开源的分布式事务解决方案&#xff0c;旨在解决分布式事务问题。 我们有必要先了解一下分布式事务&#xff1a; 在微服务体系中&#xff0c;每一个模块都有连接一个数据库&#xff0c;这一点与单体项目是不…

10-热点文章-定时计算

xxl-Job分布式任务调度 1 今日内容 1.1 需求分析 目前实现的思路&#xff1a;从数据库直接按照发布时间倒序查询 问题1&#xff1a; 如何访问量较大&#xff0c;直接查询数据库&#xff0c;压力较大 问题2&#xff1a; 新发布的文章会展示在前面&#xff0c;并不是热点文章 …

算法打卡26

今日任务&#xff1a; 1&#xff09;332.重新安排行程 2&#xff09;51.N皇后 3&#xff09;37.解数独 332.重新安排行程 题目链接&#xff1a;332. 重新安排行程 - 力扣&#xff08;LeetCode&#xff09; 给定一个机票的字符串二维数组 [from, to]&#xff0c;子数组中的两个…

2024年下半年软考报名时间

根据《人力资源社会保障部办公厅关于2024年度专业技术人员职业资格考试工作计划及有关事项的通知》&#xff0c;2024年软考一年将开考2次&#xff0c;而1次要考4天&#xff01;上半年是5月25至28日&#xff0c;024下半年软考考试时间为11月9日-12日&#xff0c;2024年下半年软考…

菜狗学前端之JS高级笔记

老样子。复制上来的图片都没了&#xff0c;想看原版可以移步对应资源下载(资源刚上传&#xff0c;还在审核中) (免费) JS高级笔记https://download.csdn.net/download/m0_58355897/89102910 一些前提概念 一 什么是js高级 js高级是对js基础语法的一个补充说明&#xff0c;本质…

高效稳定转换!PW2205芯片轻松实现12V/24V转5V/3.3V 5A输出

在电子设备蓬勃发展的今天&#xff0c;高效稳定的电源转换技术成为了推动行业进步的关键。PW2205平芯微芯片推出的高效同步降压DC-DC转换器&#xff0c;以其出色的性能和广泛的应用领域&#xff0c;成为了市场上的热门选择。 PW2205转换器凭借其卓越的性能&#xff0c;为各类电…

AI智能滤镜解决方案,全新的视觉创作体验

一张精美的图片&#xff0c;一段引人入胜的视频&#xff0c;往往能够瞬间抓住观众的眼球&#xff0c;为企业带来不可估量的商业价值。然而&#xff0c;如何快速、高效地制作出高质量的视觉内容&#xff0c;一直是困扰众多企业的难题。美摄科技凭借其领先的AI智能滤镜解决方案&a…

电脑实时监控软件分享|五个好用的实时屏幕监控软件

电脑实时监控软件是一种专门设计用于实时监控和记录电脑用户操作行为、系统状态以及网络活动的软件工具。 这类软件主要服务于企业、教育机构、家庭或个人用户&#xff0c;用于确保网络安全、提升工作效率、监督员工行为、保护儿童在线安全、防止数据泄露等多种目的。 针对企业…

Vue.js中如何使用Vue Router处理浏览器返回键的功能

在Vue.js中&#xff0c;Vue Router默认提供了处理浏览器返回键的功能。当用户点击浏览器的返回键时&#xff0c;Vue Router会自动导航到历史记录中的上一个路由。然而&#xff0c;如果你想自定义返回键的行为或者在特定的页面上进行特殊处理&#xff0c;你可以使用Vue Router的…

面试(01)————JVM篇,最大白话的一集,常见概念的讲解以及GC监控调优等等

一、JDK体系结构图 二、JVM整体架构 三、JVM组成 3.1、JVM内存区域的执行底层原理 ​编辑 3.1.1、程序计数器 3.1.2、堆栈关系的发现 3.1.3、方法去和堆的关系 3.1.4、堆&#xff08;重点&#xff09; 3.1.4.1、可达性分析算法 3.1、内存泄漏测试以及堆区的GC监控 3.…

电脑硬盘分区表的两种格式:MBR 和 GPT

电脑硬盘分区表的两种格式&#xff1a;MBR 和 GPT 段子手168 2024-4-5 电脑硬盘分区表有两种格式&#xff1a;MBR 和 GPT&#xff1a; 一、MBR 分区表 1.MBR 是主引导记录 (Master Boot Record) 的英文缩写 在传统&#xff08;Legacy&#xff09;硬盘分区模式中&#xff0c…

零基础入门NLP - 新闻文本分类比赛方案分享 nano- Rank1

nano- 康一帅 简介 环境 Tensorflow 1.14.0Keras 2.3.1bert4keras 0.8.4 文件说明 EDA&#xff1a;用于探索性数据分析。data_utils&#xff1a;用于预训练语料的构建。pretraining&#xff1a;用于Bert的预训练。train&#xff1a;用于新闻文本分类模型的训练。pred&a…

2024年妈妈杯Mathorcup数学建模竞赛C题思路解析+代码+论文

下文包含&#xff1a;2024年Mathorcup数学建模竞赛&#xff08;妈妈杯&#xff09;A- D题思路解析、选题建议、代码可视化及如何准备数学建模竞赛&#xff08;12号发&#xff09;如需第一时间获得资料和其他相关内容&#xff0c;请看文末哦&#xff01; C君将会第一时间发布选…

环形链表 II - LeetCode 热题 26

大家好&#xff01;我是曾续缘&#x1f61b; 今天是《LeetCode 热题 100》系列 发车第 26 天 链表第 5 题 ❤️点赞 &#x1f44d; 收藏 ⭐再看&#xff0c;养成习惯 环形链表 II 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xf…

ChopticsDriver调用说明

介绍 本篇介绍了关于应用程序控制光谱仪获取光谱的一些基本序列操作。这些功能对于所有辰昶光谱仪都是普遍适用的。本章详细介绍了这些基本序列操作方法&#xff0c;包括涉及的所有参数和数据类型。 函数说明 创建/实例化Wrapper对象&#xff1a; 在控制光谱仪之前&#xff…

每日OJ题_两个数组dp④_力扣44. 通配符匹配

目录 力扣44. 通配符匹配 解析代码 力扣44. 通配符匹配 44. 通配符匹配 难度 困难 给你一个输入字符串 (s) 和一个字符模式 (p) &#xff0c;请你实现一个支持 ? 和 * 匹配规则的通配符匹配&#xff1a; ? 可以匹配任何单个字符。* 可以匹配任意字符序列&#xff08;包…

React 18 中常见的生命周期方法

1. 挂载阶段&#xff08;Mounting Phase&#xff09; constructor() constructor() 是 React 组件的构造函数&#xff0c;用于初始化组件的状态和绑定方法。在组件实例创建时调用&#xff0c;且只会调用一次。 static getDerivedStateFromProps() static getDerivedStateFr…

全面了解网络性能监测:从哪些方面进行监测?

目录 摘要 引言 CPU内存监控 磁盘监控 网络监控 GPU监控 帧率监控 总结 摘要 本文介绍了网络性能监测的重要性&#xff0c;并详细介绍了一款名为克魔助手的应用开发工具&#xff0c;该工具提供了丰富的性能监控功能&#xff0c;包括CPU、内存、磁盘、网络等指标的实时…

[C语言]——柔性数组

目录 一.柔性数组的特点 二.柔性数组的使用 三.柔性数组的优势 C99中&#xff0c;结构体中的最后⼀个元素允许是未知大小的数组&#xff0c;这就叫做『柔性数组』成员。 typedef struct st_type //typedef可以不写 { int i;int a[0];//柔性数组成员 }type_a; 有些编译器会…

B. Burning Midnight Oil Codeforces Round 112 (Div. 2)

题目链接&#xff1a; Problem - 165B - Codeforceshttps://codeforces.com/problemset/problem/165/B 题目大意&#xff1a; 最后写了至少n个&#xff0c;每次衰减k倍&#xff08;/k&#xff09;&#xff0c;问最初的v最小为多少。 思路&方法&#xff1a; 二分答案。 AC代…