看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 0x44
	
ldr 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,#width
  SBFX 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, x2
	add x2, x2, 1
	/*查看NZCV操作后缀*/
	mrs x0, nzcv
	/*mi: 负数*/
	b.mi 1b

   /*测试CMP指令*/
   mov x2, 3
2:
	cmp x2, x1
	add 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)。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

面试官为什么喜欢考察Vue底层原理

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

系统更新Javahome之后,eclipse ide没有同步更新的解决方案

1、确认eclipse idea当前使用jdk 路径 &#xff1a; 2、确认Ide路径为旧的之后&#xff0c;去到eclipse的应用启动路径&#xff0c;编辑【eclipse.ini】, 在【-vmargs】之前设置vm路径&#xff08;换行为必须的&#xff09;&#xff1a; -vm C:\Program Files\Java\jdk1.8.0_1…

自动驾驶硬件-GNSS

自动驾驶硬件-GNSS 高精度全局定位系统本质上可以看做一个级联的定位系统&#xff0c;先通过GNSS系统提供一个可能的位置范围&#xff0c;再利用激光雷达(Lidar)系统、视觉定位系统等方法进行局部环境的搜索匹配&#xff0c;从而实现厘米级的定位精度。由于需要由GNSS为高精度…

shell脚本2

变量 变量是在程序中保存用户数据的一段内存存储空间&#xff0c;变量名是内存空间的首地址 字母、数字、下划线组成&#xff0c;不能以数字开头 原则&#xff1a;直接使用&#xff0c;不需要变量声明 格式&#xff1a;变量名 变量的值 环境变量 关闭窗口即会失效 若要永久生…

【Ubuntu】远程连接乌班图的方式-命令行界面、图形界面

​​​​​​系统环境&#xff1a;ubuntu-22.04.2-amd64.iso 连接工具&#xff1a;MobaXterm、windows自带远程桌面mstsc.exe 重置root密码&#xff1a;Ubuntu默认root密码是随机的&#xff0c;需要使用命令sudo passwd 进行重置。 一、命令行界面-SSH连接 1.1 SSH服务安装 …

数据的属性与相似性

目录 一、数据集的结构&#xff08;一&#xff09;二维表&#xff08;二&#xff09;数据矩阵 二、属性的类型&#xff08;一&#xff09;连续属性&#xff08;二&#xff09;离散属性&#xff08;三&#xff09;分类属性&#xff08;四&#xff09;二元属性&#xff08;五&…

CentOS 镜像下载

CentOS 镜像下载&#xff1a;https://www.centos.org/download/ 选择合适的架构&#xff0c;博主选择x86_64&#xff0c;表示CentOS7 64位系统x86架构&#xff0c;如下&#xff1a; 或者直接访问以下网站下载 清华大学开源软件镜像站&#xff1a;https://mirrors.tuna.tsin…

国产低代码工具,轻松搞定数据迁移

在日常的业务系统升级或者数据维护过程中&#xff0c;数据迁移是各个企业用户不得不面临的问题&#xff0c;尤其是数据迁移过程中要保障数据完整性、统一性和及时性&#xff0c;同时也需要注意源数据中的数据质量问题&#xff0c;比如缺失、无效、错误等问题&#xff0c;需要在…

安全大脑与盲人摸象

21世纪是数字科技和数字经济爆发的时代&#xff0c;互联网正从网状结构向类脑模型进行进化&#xff0c;出现了结构和覆盖范围庞大&#xff0c;能够适应不同技术环境、经济场景&#xff0c;跨地域、跨行业的类脑复杂巨型系统。如腾讯、Facebook等社交网络具备的神经网络特征&…

实验1 eNSP安装与使用

实验1 eNSP安装与使用 一、 原理描述二、 实验目的三、 实验内容四、 实验步骤1.下载并安装eNSP2.eNSP软件界面3.搭建并运行网络拓扑4. Wireshark 捕获分组并分析 一、 原理描述 eNSP&#xff08;Enterprise Network Simulation Platform&#xff09;是由华为提供的免费网络模…

JDK1.8的安装及环境变量的配置

下载路径&#xff1a; Java Downloads | Oracle 选择对应的操作系统进行下载 1&#xff1a;在D盘新建一个名称为Java的文件夹 [如果你下载的不是这个版本的请自行修改文件夹名称&#xff0c;如版本jdk1.8.0则文件夹名为jdk1.8.0] 2:复制红色框中的名称并在刚刚新建Java文件夹…

【攻防世界】wife_wife

原型链污染 源码 app.post(/register, (req, res) > {let user JSON.parse(req.body)if (!user.username || !user.password) {return res.json({ msg: empty username or password, err: true })}if (users.filter(u > u.username user.username).length) {return …

新平台上线需要注意哪些?

最近有很多被黑客攻击的老板问我前期平台上线安全防护方面需要注意哪些&#xff1f;下面就给大家讲一下。1、如果前期不打算上高防产品&#xff0c;数据一定要做好备份&#xff0c;否则一旦数据被篡改或者被加密&#xff0c;恢复都是比较困难的&#xff0c;甚至都没有办法恢复。…

【简单讲解下WebView的使用与后退键处理】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

使用QtChart绘制一个折线图

记录一下&#xff0c;以备以后查阅 效果图&#xff1a; #include "mychart.h" #include <QLineSeries> #include <QChart> #include <QChartView> #include <QBoxLayout> #include <QtMath>QT_CHARTS_USE_NAMESPACE MyChart::MyChart…

嵌入式:第一天(c语言入门)

目录 一、C语言是什么 二、基础语法 2.1 第一个C语言程序 2.2 注释 2.3 数据类型 数据类型介绍&#xff1a; 变量&#xff1a; 变量的语法&#xff1a; 使用特点&#xff1a; 命名规则和规范&#xff1a; 命令规范&#xff1a; char类型&#xff1a; Boolean类型&…

2024-04-08

作业要求&#xff1a; 1> 思维导图 2>使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否…

vue项目中使用html2canvas 下载当前页面(动态页面宽度、高度)

老规矩先上效果图: 需求1、 只要上图红色区域的内容下载&#xff0c;就需要计算红色区域的内容的动态宽度、高度。 需求2、当前页面可视区域的内容下载&#xff0c;上传按钮下面的所有内容。 一、 安装依赖 &#xff1a;安装html2canvas插件 npm isntall html2canvas 或者…

[渗透利器]在线渗透测试工具箱?测评

前言 hxd更新完了在线工具箱&#xff0c;受邀写一下使用体验以及测评 使用体验 这个工具箱设计的比较轻便&#xff0c;以往用过的工具箱大多都是以离线打包的方式发布&#xff0c;该工具箱&#xff0c;作者自己掏钱自己买服务器&#xff0c;自己买带宽&#xff0c;先生大义。…

[闲聊统计]之参数估计是什么?(下)

我们在前面说了一下参数估计中的点估计&#xff0c;接下来&#xff0c;我们来讲一下区间估计。 区间估计——在点估计的基础上&#xff0c;给出总体参数估计的一个估计区间&#xff0c;该区间由样本统计量加减估计误差而得到。 置信水平——如果将构造置信区间的步骤重复多次&a…