看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;子数组中的两个…

菜狗学前端之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;用于确保网络安全、提升工作效率、监督员工行为、保护儿童在线安全、防止数据泄露等多种目的。 针对企业…

面试(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…

环形链表 II - LeetCode 热题 26

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

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

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

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

目录 摘要 引言 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代…

2024零废弃日青山少年可持续工坊走进南湖社区

“零废弃”不代表完全不产生任何垃圾&#xff0c;而是一种“尽可能避免产生废弃”的生活态度&#xff0c;每一个人都可以从零开始&#xff0c;从日常的随手小事开始&#xff0c;珍惜每一件物品、珍视每一种情绪&#xff0c;为生活腾出更大的空间。 2024零废弃日&#xff0c;北…

JS 表单验证

点击注册的时候&#xff0c;渲染出来&#xff0c;验证码是自动获取出来的 html&#xff1a; <div class"div1">用户名<input type"text" id"yhm"><span id"span1"></span><br>密码<input type"…

《Git版本控制管理》笔记

第三章 起步 git --version查看版本号git --help查看帮助文档裸双破折号分离参数 git diff -w master origin – tools/Makefile将当前目录或任何目录转化为Git版本库 git init 初始化之后项目目录中&#xff0c;有名为.git的文件git status 查看git状态git commit 提供日志消…

贪心算法|135.分发糖果

力扣题目链接 class Solution { public:int candy(vector<int>& ratings) {vector<int> candyVec(ratings.size(), 1);// 从前向后for (int i 1; i < ratings.size(); i) {if (ratings[i] > ratings[i - 1]) candyVec[i] candyVec[i - 1] 1;}// 从后…

格式化字符串漏洞原理及其利用(附带pwn例题讲解)

写在前面&#xff1a; 本篇博客为本人原创&#xff0c;但非首发&#xff0c;首发在先知社区 原文链接&#xff1a; https://xz.aliyun.com/t/14253?time__1311mqmx9QiQi%3D0%3DDQoDsNOfptD8nDCFdNNK4D&alichlgrefhttps%3A%2F%2Fxz.aliyun.com%2Fu%2F74789各位师傅有兴趣…