Linux 学习记录52(ARM篇)

news2024/11/29 0:31:51

Linux 学习记录52(ARM篇)

在这里插入图片描述

本文目录

  • Linux 学习记录52(ARM篇)
  • 一、汇编语言相关语法
    • 1. 汇编语言的组成部分
    • 2. 汇编指令的类型
    • 3. 汇编指令的使用格式
  • 二、基本数据处理指令
    • 1. 数据搬移指令
      • (1. 格式
      • (2. 指令码类型
      • (3. 使用示例
    • 2. 立即数
      • (1. 一条指令的组成
    • 3. 移位操作指令
      • (1. 格式
      • (2. 指令码类型
      • (3. 使用示例
    • 4. 位运算指令
      • (1. 格式
      • (2. 指令码
      • (3. 运算规则
      • (4. 使用示例
      • (5. 练习
    • 5. 算数运算指令
      • (1. 格式
      • (2. 指令码
      • (3. 使用示例
      • (4. 关于32位的处理器进行64位数据的运算原理
    • 6. 比较指令
      • (1. 概述
      • (2. 比较指令结果的条件码
      • (3. 使用示例
    • 7. 跳转指令
      • (1. 概述
      • (2. 不保存返回地址
      • (3. 跳转之前保存返回地址
  • 练习
    • 1. 实现1-100的累加

一、汇编语言相关语法

1. 汇编语言的组成部分

1.伪操作
    不参与到程序的执行,但是可以告诉编译器程序应该怎么执行,或者程序中每一个部分有什么含义
    .text .global  .globl .end  .if .else .endif   
2.汇编指令
    编译器将一条汇编指令编译成一条机器码,执行指令后可以让ALU做出对应的运算操作,实现特定的功能
3.伪指令
    不是汇编指令,但是可以起到和汇编指令一样的作用,通常一条伪指令的实现需要多条汇编指令一起完成
    
4.汇编里的注释:
    单行注释:使用@  其他架构下的汇编单行注释 可能会使用';'
    多行注释:/**/
    条件注释:根据if后面的数值真假来去执行不同的指令段,如果为真,执行指令段1,否则执行指令段2
        .if 数值
            指令段1
        .else
            指令段2
        .endif                

2. 汇编指令的类型

  1. 基本的数据处理指令
  1. 数据搬移指令
  2. 数据移位指令
  3. 算数运算指令
  4. 位运算指令
  5. 比较指令
  1. 跳转指令
  2. 内存读写指令
  3. 程序状态寄存器读写指令
  4. 软中断指令

3. 汇编指令的使用格式

格式:opcode{cond}{s}  Rd, Rn, shifter_operand

解释:
opcode : 指令码  
cond : 条件码  
    默认汇编指令是无条件执行的,使用条件码之后可以让汇编有条件的执行
s: 状态位  
    指令的执行结果会影响cpsr的NZCV位   
Rd : 目标寄存器 
    运行的结果放到目标寄存器
Rn : 第一个操作寄存器,只能是一个寄存器

shifter_operand : 第二个操作数 
    1> 可以是一个普通的寄存器
    2> 可以是一个立即数
    3> 可以是经过移位操作的寄存器
opcode{cond}{s} : 连到一起写
Rd, Rn, shifter_operand : 使用逗号隔开
opcode{cond}{s}和Rd, Rn, shifter_operand直接使用空格隔开

一条汇编指令占一行;
汇编代码中不严格区分大小写: 

二、基本数据处理指令

1. 数据搬移指令

(1. 格式

opcode{cond}{s}    Rd,       shifter_operand
指令码           目标寄存器      操作数

(2. 指令码类型

1. mov:将操作数搬移到寄存器中
2. mvn:将操作数按位取反后搬移到目标寄存器中

(3. 使用示例

.text   
.global _start
_start:
    mov r0,#0XFF  @将0XFF搬移到r0寄存器中
    mvn r1,#0XFF  @将0XFF按位取反结果存放到R1寄存器中
    
stop:
    b stop   
.end 

在这里插入图片描述
在这里插入图片描述

2. 立即数

能够当作指令的一部分去执行的数据叫做立即数。一个立即数可以通过一个0-255之间的数字进行循环右移得到

如何判断一个数据是不是立即数:
在0-255内找到一个数据,将数据循环右移偶数位,如果能够得到这个数据,就说明这个数据是一个立即数
ex1:0X104->二进制:0000 0000 0000 0000 0000 0001 0000 0100
找到一个0-255范围内的数:0000 0000 0000 0000 0000 0000 0100 0001——》0X41
0x41循环右移30位可以得到0X104,所以0X104就是立即数

ex:0X101->二进制:0000 0000 0000 0000 0000 0001 0000 0001

(1. 一条指令的组成

在32位下一条指令大小为32字节

[0:7] "0-255的数据 进行循环右移的数据,通过这个数据循环右移偶数位可以得到第二操作数"
[8:11] "低八位循环右移的偶数位对应拖偶数由这个区间的数值*2得到"
[12:15] "Rd 目标寄存器标识"
[16:19] "Rn 操作寄存器标识"
[20:21] "s 状态位"
[22:25] "opcond 指令码"
[26:27] "001"
[28:31] "cond 条件码"

注意:对于立即数的判断,如果数据mov指令的操作数>0XFFFF0000,则在计算机处理时,按照MVN指令进行判断
在这里插入图片描述

可以使用伪指令
在这里插入图片描述

3. 移位操作指令

(1. 格式

格式:opcode{cond}{s}  Rd, Rn, shifter_operand

解释:
opcode : 指令码  
cond : 条件码  
    默认汇编指令是无条件执行的,使用条件码之后可以让汇编有条件的执行
s: 状态位  
    指令的执行结果会影响cpsr的NZCV位   
Rd : 目标寄存器 
    运行的结果放到目标寄存器
Rn : 第一个操作寄存器,只能是一个寄存器

shifter_operand : 第二个操作数 

(2. 指令码类型

1. 左移运算 低位补0
2. lsr:右移运算  高位补0
3. ror:循环右移  低位移出的数据补到最高位

(3. 使用示例

.text   
.global _start   
    
_start:
    mov r0,#0XFF
    lsl r1,r0,#4  @ 将r0的值左移4位结果放到r1中 R1==0XFF0
    lsr r2,r0,#4  @将r0的值右移4位结果放到r2中 R2==0XF
    ror r3,r0,#4   @ 将r0的值循环右移4位结果放到r3中 R3==0XF000000F
stop:
    b stop   
.end  

在这里插入图片描述

4. 位运算指令

(1. 格式

格式:opcode{cond}{s}  Rd, Rn, shifter_operand

解释:
opcode : 指令码  
cond : 条件码  
    默认汇编指令是无条件执行的,使用条件码之后可以让汇编有条件的执行
s: 状态位  
    指令的执行结果会影响cpsr的NZCV位   
Rd : 目标寄存器 
    运行的结果放到目标寄存器
Rn : 第一个操作寄存器,只能是一个寄存器

shifter_operand : 第二个操作数 

(2. 指令码

1. and:按位与  与0清0,与1不变
2. orr:按位或  或1置1 或0不变
3. eor:按位异或  相同为0 不同为1
4. bic:按位清0  想要哪一位设置为0,只需要将这一位用bic指令和相同位为1的数进行运算

(3. 运算规则

在这里插入图片描述

(4. 使用示例

.text   
.global _start   
    
_start:
    mov r0,#0XFF
    and r1, r0,#0XF  @r1==0XF
    orr r2,r0,#0XF00  @r2==0XFFF
    eor r3,r0,#0XF  @R3==0XF0
    bic r4,r0,#0X14 @R4==0XEB       
stop:
    b stop   
.end  

在这里插入图片描述

(5. 练习

LDR r0,=0X12345678
 0001 0010 0011 0100 0101 0110 0111 1000
1.将r0寄存器的第4位清0,其他位不变
bic r0,r0,#(1<<4)
或者
and r0,r0,#(~(1<<4))

2.将R0寄存器的第7位置1,其他位不变
 orr r0,r0,#(1<<7)

3.将r0寄存器的第[31:28]0,其他位不变
bic r0,r0,#(0XF<<28)

4.将r0寄存器第[7:4]位置1,其他位不变
ORR r0,r0,#(0XF<<4)

5.将R0寄存器的第[15:11]位设置为10101,其他位不变
思路:把指定的几位设置为特定的数值,先把这几位清0,在赋值
BIC r0,r0,#(0X1F<<11)@先清0
ORR r0,r0,#(0X15<<11)@再赋值

5. 算数运算指令

(1. 格式

格式:opcode{cond}{s}  Rd, Rn, shifter_operand

解释:
opcode : 指令码  
cond : 条件码  
    默认汇编指令是无条件执行的,使用条件码之后可以让汇编有条件的执行
s: 状态位  
    指令的执行结果会影响cpsr的NZCV位   
Rd : 目标寄存器 
    运行的结果放到目标寄存器
Rn : 第一个操作寄存器,只能是一个寄存器

shifter_operand : 第二个操作数 

(2. 指令码

1. add :进行加法运算
2. adc:进行加法运算的时候考虑到CPSR的c位 
3. sub:进行减法运算
4. sbc:进行减法运算时考虑到CPSR的C位
5. mul:乘法运算

(3. 使用示例

1.加法1:
    MOV r0,#1
     mov r1,#3
    add r2,r0,r1 @将r0+r1的结果存放r2寄存器
2.加法2:
    MOV r0,#0XFFFFFFFE
    mov r1,#3
    adds r2,r0,r1 @将r0+r1的结果存放r2寄存器,+s结果进位就会影响到CPSR的c位

3.减法运算
MOV r0,#3
    mov r1,#0XFFFFFFFE
    subs r2,r0,r1 @将r0-r1的结果存放r2寄存器

(4. 关于32位的处理器进行64位数据的运算原理

原理:一个64位的数据放在两个寄存器中,分别存放这个数据的高64位以及低64位
进行64位数据运算时,将两个64位数据的低32位运算,高32位运算

以加法为例子:
    MOV r0,#0X3  @第一个64位数的低32位 
    mov r1,#0X1 @第一个数的高32位
    mov r2,#0XFFFFFFFE @第2个64位数的低32位
    mov r3,#0X4 @第二个64位数据的高32位
    adds r4,r0,r2 @两个低32位数运算,结果影响到CPSR的C位
    adc r5,r1,r3 @两个高32位数据运算,结果存放在r5中,考虑到C位

6. 比较指令

(1. 概述

格式:
opcode Rn, shifter_operand
opcode:比较指令的指令码是cmp
功能:将第一操作寄存器和第二操作数的值进行比较
本质:比较指令的本质就是拿进行比较的两个数值进行减法运算,并且减法运算的结果会影响到CPSR的条件位
我们可以根据条件位的数值进行两个数值的判断,再根据判断的结果做不同的操作
一般比较指令和条件码都是一起使用的

(2. 比较指令结果的条件码

条件码助记符后缀标志含义
0000eqz置位相等
0001nez清零不相等
0010csc置位无符号数大于或等于
0011ccc清零无符号数小于
0100min置位负数
0101pln清零正数或零
0110vsv置位溢出
0111vcv清零未溢出
1000hic置位z清零无符号数大于
1001lsc清零z置位无符号数小于或等于
1010gen等于v带符号数大于或等于
1011ltn不等于v带符号数小于
1100gtz清零且n等于v带符号数大于
1101lez置位或n不等于v带符号数小于或等于
1110al忽略无条件执行

(3. 使用示例

.text   
.global _start   
    
_start:
    MOV r0,#0X3  
    mov r1,#0X1 
    cmp r0,r1  @数值比较
    @根据比较的结果执行不同的指令
    addeq  r2,r1,r0  @如果两个数相等,两数相加,将结果保存至r2中
    subcs r3,r0,r1  @如果r0>=r1,就做减法运算,将结果保存在r3寄存器
    mulcc r4,r0,r1 @如果r0<r1,就做乘法运算,结果保存在r4寄存器中
stop:
    b stop   
.end  

在这里插入图片描述

7. 跳转指令

(1. 概述

格式:
opcode{cond} label
功能:跳转到指定的标签下

功能码:
1. b :跳转到指定的标签下,返回地址不保存
2.bl:跳转到指定的标签下,返回地址保存至 LR寄存器中

(2. 不保存返回地址

.text   
.global _start   
    
_start:
    MOV r0,#0X3  
    mov r1,#0X1 
    b fun  @跳转到fun标签
    cmp r0,r1  @数值比较
    @根据比较的结果执行不同的指令
    addeq  r2,r1,r0  @如果两个数相等,两数相加,将结果保存至r2中
    subcs r3,r0,r1  @如果r0>=r1,就做减法运算,将结果保存在r3寄存器
    mulcc r4,r0,r1 @如果r0<r1,就做乘法运算,结果保存在r4寄存器中
fun:
    mov r3,#3
    mov r4,#4
stop:
    b stop   
.end  

在这里插入图片描述

(3. 跳转之前保存返回地址

.text   
.global _start   
_start:
    MOV r0,#0X3  
    mov r1,#0X1 
    bl fun  @跳转到fun标签,返回地址保存至LR寄存器
    cmp r0,r1  @数值比较
    @根据比较的结果执行不同的指令
    addeq  r2,r1,r0  @如果两个数相等,两数相加,将结果保存至r2中
    subcs r3,r0,r1  @如果r0>=r1,就做减法运算,将结果保存在r3寄存器
    mulcc r4,r0,r1 @如果r0<r1,就做乘法运算,结果保存在r4寄存器中
fun:
    mov r3,#3
    mov r4,#4
    mov pc,lr @程序返回
stop:
    b stop   
.end

在这里插入图片描述

练习

1. 实现1-100的累加

.text   
.global _start   
_start:

	mov r0,#0 @将r0作为计数器
	mov r1,#0 @将r1作为和

stop:
	add r0,#1		@累计循环次数
	cmp r0,#101 	@比较循环次数
	beq over		@当满足条件时跳转至over处
	addls r1,r1,r0	@当循环次数小于101时累加

    b stop  

over:				@当循环结束跳转到次处

	mov r2,r1		@将r1计算的结果赋值给r2
.end  

在这里插入图片描述

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

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

相关文章

MySQL执行过程与bufferPool缓存机制

MySQL执行过程与bufferPool缓存机制 一、SQL执行流程图二、个人理解的Innodb执行引擎执行顺序1、去磁盘文件查找id为1的整页数据&#xff0c;加载到Buffer Pool缓存池中&#xff1b;2、然后写入更新数据的旧值&#xff08;这里指namezhuge的数据&#xff09;&#xff0c;写入到…

【电路原理学习笔记】第4章:能量与功率:4.5 稳压电源与电池

第4章&#xff1a;能量与功率 4.5 稳压电源与电池 电网采用交流电形式将电能从发电站传输给用户&#xff0c;这是因为交流电易于转换成适宜传输的高压和终端用户使用的低压。在远距离传输时&#xff0c;采用高电压传输的效率和效益要高得多。对于给定的功率&#xff0c;较高的…

安全开发-PHP应用模版引用Smarty渲染MVC模型数据联动RCE安全TP框架路由访问对象操作内置过滤绕过核心漏洞

文章目录 自写模版引用Smarty模版引用代码RCE安全测试TP框架-开发-配置架构&路由&MVC模型TP框架-安全-不安全写法&版本过滤绕过 自写模版引用 1、页面显示样式编排 <?php include config.php; $templatefile_get_contents(new.html);$id$_GET[id] ? :1; $sq…

win11中的pagefile.sys

在C盘系统下&#xff0c;有一个命名为pagefile.sys的文件占用C盘太大的空间&#xff0c;不少用户怕删除pagefile.sys文件之后会对系统造成影响&#xff0c;而不少用户想要将pagefile.sys文件移动到D盘中。那么pagefile.sys是什么文件&#xff1f;Win10系统下pagefile.sys文件太…

解决appium-doctor报 bundletool.jar cannot be found

一、下载bundletool.jar 下载地址&#xff1a;https://github.com/google/bundletool/releases 二、重命名 重命名这个jar包为bundletool.jar&#xff0c;在android sdk目录下&#xff0c;新建bundle-tool目录&#xff0c;把bundletool.jar包放入其中。 三、配置环境 path后追加…

大模型开发(七):LLM提示工程(Prompt)与思维链(CoT)

全文共6500余字&#xff0c;预计阅读时间约13~20分钟 | 满满干货(附案例)&#xff0c;建议收藏&#xff01; 一、LLM模型的涌现能力 在GPT没有爆火之前&#xff0c;一直以来的共识都是&#xff1a;模型的规模越大&#xff0c;模型在下游任务上的能力越多、越强。 LLM原始训…

LeetCode 75 第四题(605)种花问题

题目: 示例: 分析: 给一个数组表示一个花园,其中0表示空地,1表示已经有花种下去了. 空地可以种花,但是花和花之间不能相邻,即数组中不能有两个连续的1. 给一个数n,问我们能不能在花园里种n朵花. 我们可以找出我们所能种的最多的数量(而不是只种n朵),然后比较我们最多能种的…

idea手动导入了包但编译运行还是报找不到xxx.jar包的问题

1、先把jar包放目录下并add as libary 2、在pom.xml中加入 <!--添加的本地的外部jar包依赖--><dependency><!--groupId、artifactId、version为自定义&#xff0c;groupId与artifactId但是不能重名--><groupId>JNative</groupId><artifactId…

搭建srt服务器

目录 1、下载和编译srt2、下载和编译srt-live-server3、编译工程,并把编程出来的可执行程序放到nfs4、板子上跑程序5、用ffplay从srt服务器上流6、srt中./configure遇到的问题解决方法1、下载源码2、下载好之后cp到ubuntu3、解压安装4、创建软链接:创建快捷名字tclsh,放到us…

2023-07-18力扣今日两题-太难了吧

链接&#xff1a; LCP 75. 传送卷轴 题意&#xff1a; 给一个正方形迷宫&#xff0c;主角是A&#xff0c;每次可以上下左右走一格子&#xff0c;有四种类型的格子&#xff1a;墙、初始位置、魔法水晶、空地 另一个人B&#xff0c;可以传送一次A&#xff0c;只能在空地传送&…

青岛大学_王卓老师【数据结构与算法】Week05_14_队列的顺序表示和实现2_学习笔记

本文是个人学习笔记&#xff0c;素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享&#xff0c; 另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权&#xff0c;请留言作删文处理。 课程视频链接&#xff1a; 数据结构与算法基础…

“掌握更多的快速排序技巧:三路划分、双路快排和非递归的深入理解”

快速排序是一种基于分治思想的排序算法&#xff0c;它能够以极快的速度将一个乱序的数组重新排列成有序的序列。不仅如此&#xff0c;快速排序还具有简洁的实现代码和良好的可扩展性&#xff0c;成为最受欢迎的排序算法之一。接下来&#xff0c;让我带你了解一下它的魅力吧&…

下半年的 58,准备疯狂内卷?

阅读本文大概需要 1.18 分钟。 关于 58同城&#xff0c;大家都很熟悉&#xff0c;最近看到它的相关信息&#xff0c;还是源于公司「毕业」的事情。 脉脉上在 5 月的时候就开始讨论说 58同城正在进行一波「毕业」&#xff0c;裁员比例在 30%至少。 紧接着&#xff0c;58的老总姚…

Openlayers实战:加载WKT文件

在OPenlayers的交互中,经常性的我们要加载一些数据,在这个实战中,演示的是加载WKT文件。 WKT格式是一种文本格式,用于描述二维和三维几何对象的空间特征。WKT是“Well-Known Text”的缩写,是一种开放的国际标准,由Open Geospatial Consortium(OGC)定义和维护。WKT格式…

vue实现左右布局(右侧超出的时候换行展示)

目录 vue实现左右布局(右侧超出的时候换行展示)code效果 vue实现左右布局(右侧超出的时候换行展示) code <ul class"body-detail"><li><div class"li-label">姓名</div><div class"li-value">XXXXXXXXXXXXXXXXXX…

ai绘画软件哪个好?这几款ai绘画图片生成器分享给你

近期我有个朋友过生日&#xff0c;我想画一幅动物图片绘画送给他&#xff0c;但是奈何我的绘画技巧实在是不堪入目。好在我有几个朋友刚好是ai绘画师&#xff0c;他们跟我说&#xff0c;现在有一些ai绘画工具&#xff0c;可以轻松帮助我画出非常优质的动物图片画作&#xff0c;…

汤臣倍健盈利水平再创新高,其爆品逻辑或可复制粘贴!

前几天&#xff0c;汤臣倍健官方发布了《2023年半年度业绩预告》&#xff0c;预计归母净利润约13.63亿元至15.72亿元。对比上年同期增长30%—50%&#xff0c;上半年盈利水平有望超过2021年中报业绩的13.71亿元&#xff0c;再创新高。 汤臣倍健最初成立于1995年&#xff0c;在20…

项目经理为什么越来越难做了?

作为项目经理&#xff0c;我们面临着来自各方的挑战和质疑。这个职位的困难度越来越高&#xff0c;越来越多的人开始对这个职位感到不满意。然而&#xff0c;要成为一名优秀的项目经理&#xff0c;我们需要深入思考并采取正确的策略。 1、明确项目目标 项目经理在接手一个项目…

类 和 对象

目录 1、面向对象编程 2、面向对象编程 2.1面向对象编程特征 3、类和对象的概念 3.1类的定义 3.11属性 3.12方法 3.13重载 3.14递归 3.13返回值return 3.2对象 3.2.1对象组合 4、jvm内主要三块内存空间 5、参数传值 1、面向对象编程 面向过程&#xff1a;关注的是步骤…

fastadmin 行内无刷新编辑editable插件使用方法详解

后台插件安装好后&#xff0c;只用设置js即可 define([jquery, bootstrap, backend, table, form,editable], function ($, undefined, Backend, Table, Form) {var Controller {index: function () {// 初始化表格参数配置Table.api.init({extend: {index_url: wd/guanli/in…