Linux 学习记录52(ARM篇)

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,#0XFFlsl r1,r0,#4  @ 将r0的值左移4位结果放到r1中 R1==0XFF0lsr r2,r0,#4  @将r0的值右移4位结果放到r2中 R2==0XFror 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,#0XFFand r1, r0,#0XF  @r1==0XForr r2,r0,#0XF00  @r2==0XFFFeor r3,r0,#0XF  @R3==0XF0bic r4,r0,#0X14 @R4==0XEB       
stop:b stop   
.end  

在这里插入图片描述

(5. 练习

LDR r0,=0X123456780001 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,#1mov r1,#3add r2,r0,r1 @将r0+r1的结果存放r2寄存器
2.加法2:MOV r0,#0XFFFFFFFEmov r1,#3adds r2,r0,r1 @将r0+r1的结果存放r2寄存器,+s结果进位就会影响到CPSR的c位3.减法运算
MOV r0,#3mov r1,#0XFFFFFFFEsubs 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,#3mov 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,#3mov r4,#4mov 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.hqwc.cn/news/28892.html

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

相关文章

Meta 最新发布 LLaMA 2(允许商业化)

2023年7月18日&#xff0c;Meta 发布了LLaMA 2&#xff0c;包含7B&#xff0c;13B&#xff0c;70B三种参数&#xff08;34B暂时还未发布&#xff09;。 官方&#xff1a; https://ai.meta.com/llama/ 论文&#xff1a;Llama 2: Open Foundation and Fine-Tuned Chat Models 模型…

网络编程——RPC与HTTP基本介绍、历史追溯、主流应用场景、对比分析、为什么还需要使用RPC

一、HTTP与RPC基本介绍 HTTP协议&#xff08;Hyper Text Transfer Protocol&#xff09;超文本传输协议&#xff1a; 一个用于在网络上交换信息的标准协议&#xff0c;它定义了客户端(例如浏览器)和服务器之间的通信方式。如平时上网在浏览器上敲个网址url就能访问网页&#x…

关于电脑显示器屏幕看不出灰色,灰色和白色几乎一样无法区分,色彩调整方法

问题&#xff1a; 电脑显示器屏幕看不出灰色&#xff0c;灰色和白色几乎一样无法区分。白色和灰色有色差。 解决方法&#xff1a; 打开“控制面板” ->“色彩管理” ->“高级” ->“校正显示器” 在下一步调节中调成中间这一个实例的样子就可以了 进行微调&#x…

如何用3D格式转换工具HOOPS Exchange读取颜色和材料信息?

作为应用程序开发人员&#xff0c;非常希望导入部件的图形表示与它们在创作软件中的外观尽可能接近。外观可以在每个B-Rep面的基础上指定&#xff0c;而且&#xff0c;通过装配层次结构的特定路径可以在视觉外观上赋予父/子覆盖。HOOPS ExchangeHOOPS Exchange可捕获有关来自各…

亚信科技荣任「DBL电信行业工作组」副组长单位,AntDB数据库连年入选《中国数据库产品图谱》

日前&#xff0c;“2023可信数据库发展大会”在京圆满召开。亚信科技凭借自研的电信级核心交易数据库AntDB在通信行业15年的技术积累和行业贡献&#xff0c;成功当选为数据库应用创新实验室&#xff08;DBL&#xff09;电信行业工作组副组长单位。AntDB数据库连续两年入选《全球…

11、动手学深度学习——语言模型和数据集:代码详解

我们了解了如何将文本数据映射为词元&#xff0c;以及将这些词元可以视为一系列离散的观测&#xff0c;例如单词或字符。 假设长度为 T T T的文本序列中的词元依次为 x 1 , x 2 , … , x T x_1, x_2, \ldots, x_T x1​,x2​,…,xT​。于是&#xff0c; x t x_t xt​&#xff08…

Type-C带充电的OTG转接器方案 LDR6028

近些年随着社会生活水平提高&#xff0c;每个人的的电子设备逐渐的多了起来&#xff0c;各大品牌都在发售自家品牌的全家桶。手机、平板、笔记本电脑、智能手表、无线耳机、任天堂Switch、索尼PS5等电子设备一种不落。 那么多的电子设备基本来说都是需要充电&#xff0c;比如手…

求出0~100000之间的所有“水仙花数”并输出

求出0~100000之间的所有“水仙花数”并输出。 “水仙花数”是指一个N位数&#xff0c;其各位数字的n次方之和正好等于该数本身。 如&#xff1a;1531^3 5^3 3^3 , 则153是一个“水仙花数” 先来了解一下水仙花数的概念&#xff1a; 水仙花数只是自幂数的一种&#xff0c;严…

匿名内部类/Lambda Java和Kotlin谁会导致内存泄漏?

作者&#xff1a;小鱼人爱编程 前言 内存泄漏是程序界永恒的话题&#xff0c;对于Android开发来说尤为重要&#xff0c;想让你的App表现得更优雅&#xff0c;了解并治理内存泄漏问题势在必行。 通过本篇文章&#xff0c;你将了解到&#xff1a; 何为内存泄漏?Android 常见内存…

动态规划---子序列问题

一)最长递增子序列: 300. 最长递增子序列 - 力扣&#xff08;LeetCode&#xff09; 算法原理: 1.定义一个状态表示:经验题目要求 dp[i]表示&#xff0c;以i位置为结尾&#xff0c;最长递增子序列的长度 中心思路就是找到以i位置为结尾的所有递增子序列&#xff0c;然后找到递增…

causal-learn ModuleNotFoundError: No module named ‘pygam‘

调用 causallearn 库包&#xff0c;测试CAM-UV算法时报错&#xff1a; No module named pygam 解决方法&#xff1a; pip install pygam 参考链接&#xff1a; 【Python Causal Learning Toolbox】causallearn 库包的使用、报错修改_板砖板砖我是兔子的博客-CSDN博客

linux kernel单独编译某项驱动

linux内核经常涉及编译某一项驱动代码的场景&#xff0c;本次以网卡驱动e1000为例说明整个步骤流程。 首先编译内核驱动不必要编译整个内核&#xff0c;但编译的驱动代码必须要和要安装的内核版本保持一致&#xff0c;否则经常会出现无法加载模块。 在编译驱动前&#xff0c;最…