ARM处理器 指令(读写内存、状态寄存器、软中断、协处理器……)

news2024/11/13 15:05:35

  • 一、数据处理指令
    • 1)数学运算
            • 数据运算指令的格式
            • 数据搬移指令
            • 立即数
            • 伪指令
            • 加法指令
            • 带进位的加法指令
            • 减法指令
            • 带借位的减法指令
            • 逆向加法指令
            • 乘法指令
            • 数据运算指令的扩展
    • 2)逻辑运算
            • 按位与指令
            • 按位或指令
            • 按位异或指令
            • 左移指令
            • 右移指令
            • 位清零指令
    • 3)比较指令
            • 怎么影响到CPSR寄存器中的状(N, Z, C, V)
            • 比较指令
            • ARM指令的条件码
  • 二、跳转指令
    • 1)跳转指令
            • 跳转指令
  • 三、Load / Srore指令
    • 1)内存访问指令
            • 写内存
            • 读内存
    • 2)ARM指令的寻址方式
            • 立即寻址
            • 寄存器寻址
            • 寄存器移位寻址
            • 寄存器间接寻址
            • 基址加变址寻址
            • 基址加变址寻址的索引方式
            • 多寄存器内存访问指令的寻址方式
    • 3)栈的种类与使用
  • 四、状态寄存器传送指令
  • 五、软中断指令
  • 六、协处理器指令

一、数据处理指令

数据处理指令(数学运算、逻辑运算)

1)数学运算

32位处理器什么意思:单次运算数据的能力,单次最大可处理32位的数据

数据运算指令的格式

《操作码》《目标寄存器》《第一操作寄存器》《第二操作数》
操作码: 表示执行哪种操作
目标寄存器: 表示存储运算的结果
第一操作寄存器: 存储第一个参与运算的寄存器(只能是寄存器)
第二操作数: 存储第二个参与运算的数据(寄存器、立即数都可以)

数据搬移指令

MOV R1, #1
MOV R2, R1 // R2 = R1
MOV PC, #7 // 可以更改PC的值,但是系统会默认把后两位改成0,7八进制>111系统会自动改成4>100
MVN R0, #0xFF // R0 = ~0xFF R0的内容就是0xFFFFFF00

立即数

立即数的本质是包含在指令当中的数,属于指令的一部分,这条执行是一起编译成机器码的
优点:
取值的时候就可以直接读取到CPU,不用单独去内存读取,速度快
缺点:
不能是任意的32位的数字,有局限性
MOV R1, #0x12345678 //不可以执行,因为数字太大
MOV R1, #0x12 //可以执行

伪指令

MOV R1, #0xFFFFFFFF
//当执行这条指令的时候显然这个数字太大,但是可以编译成功,是系统自动会将这条指令替换成 MVN R1, #0x00000000 这样就和MOV R1, #0xFFFFFFFF 指令执行的效果一样,这样的行为前提是两条指令要达到的效果相同

加法指令

ADD R1, R2, R3 //R1 = R2+R3

带进位的加法指令

ADC R5, R2, R4 // R5 = R2 + R4 + ‘CPSR->C’

减法指令

SUB R1, R2, R3 //R1 = R2-R3

带借位的减法指令

SBC R5, R2, R4 // R5 = R2 - R4 - ‘~CPSR->C’ 取反

逆向加法指令

RSB R1, R2, #3 //R1 = 3-R2

乘法指令

MUL R1, R2, R3 //R1 = R2*R3 乘法指令只能是两个寄存器执行

数据运算指令的扩展

MOV R1, R2, LSL #1 //R1 = (R2<<1)

2)逻辑运算

按位与指令

AND R1, R2, R3 //R1 = R2&R3

按位或指令

ORR R1, R2, R3 //R1 = R2 | R3

按位异或指令

EOR R1, R2, R3 //R1 = R2 ^ R3

左移指令

LSL R1, R2, R3 //R1 = R2 << R3

右移指令

LSR R1, R2, R3 //R1 = R2 >> R3

位清零指令

MOV R2, #0xFF
BIC R1, R2, #0x0F
//第二操作数的哪一位为1,就把第一寄存器中的哪一位清零,然后将结果放入目标寄存器中

3)比较指令

怎么影响到CPSR寄存器中的状(N, Z, C, V)

数据运算指令对条件位CPSR寄存器中的状(N, Z, C, V)的影响
默认情况下数据运算不会对条件位产生影响,当在指令后加后缀‘S’后可以影响
MOV R2, #3
SUBS R1, R2, #5 //将会对 N 状态位产生影响

比较指令

CMP R1, R2
本质是一条(SUBS),只是没有将运算结果放入寄存器当中,是看CSPR寄存器状态位(N, Z, C, V)

==	Z=1
!=	Z=0
<	C=0
<=	C=0 或 Z=1
>	C=1 且 Z=0 
>=	C=1
  MOV R1, #1
		  MOV R2, #2
		  CMP R1, R2
		  BEQ FUNC	
		  @ 执行逻辑:if(EQ){B FUNC}	本质:if(Z==1){B FUNC}
		  BNE FUNC	
		  @ 执行逻辑:if(NE){B FUNC}	本质:if(Z==0){B FUNC}
		  MOV R3, #3
		  MOV R4, #4
		  MOV R5, #5
  FUNC:
		  MOV R6, #6
		  MOV R7, #7

		  @ ARM指令集中大多数指令都可以带条件码后缀
		  MOV R1, #1
		  MOV R2, #2
		  CMP R1, R2
		  MOVGT R3, #3
		
@ 练习:用汇编语言实现以下逻辑
			  int R1 = 9;
			  int R2 = 15;
		  START:
			  if(R1 == R2)
			  {
			  	STOP();
			  }
			  else if(R1 > R2)
			  {			
			  	R1 = R1 - R2;
			  	goto START;
			  }
			  else
			  {
			  	R2 = R2 - R1;
			 	goto START;
			  }
		
@ 练习答案:
		  MOV R1, #9
		  MOV R2, #15
  START:
		  CMP R1,R2
		  BEQ STOP
		  SUBGT R1, R1, R2
		  SUBLT R2, R2, R1
		  B START
  STOP:				
		  B STOP

在这里插入图片描述

ARM指令的条件码

ARM指令集中大多数指令都可以带条件码后缀(如:SUBEQ)

在这里插入图片描述

二、跳转指令

1)跳转指令

跳转指令

有三种方式

第一种方法:直接去修改PC的值(不建议使用,因为需要自己计算绝对地址)

MAIN:
	MOV R1, #1
	MOV R2, #2
	MOV PC, #0x16
	MOV R3, #3
	
FUNC:
	MOV R4, #4
	MOV R5, #5
	MOV R6, #6

第二种方法:不带返回的跳转指令,本质就是将PC寄存器的值修改成跳转标号下第一条指令的地址

MAIN:
	MOV R1, #1
	MOV R2, #2
	B	FUNC
	MOV R3, #3
	
FUNC:
	MOV R4, #4
	MOV R5, #5
	MOV R6, #6

第三种方法;带返回的跳转指令,本质就是将PC寄存器的值修改成跳转标号下第一条指令的地址,同时将跳转指令的下一条指令的地址存储到LR

MAIN:
	MOV R1, #1
	MOV R2, #2
	BL	FUNC
	MOV R3, #3
	
FUNC:
	MOV R4, #4
	MOV R5, #5
	MOV R6, #6
	MOV PC, LR

三、Load / Srore指令

Load / Srore指令(访问(读写)内存)

1)内存访问指令

Load/Srore指令:访问(读写)内存 当LD开头的指令 内存读数据到CPU 当ST开头的指令 把CPU中的数据存到内存当中

写内存
	@ MOV R1, #0xFFFFFFF1
	@ MOV R2, #0x40000000
	@ STR R1, [R2]		默认是写入一个字(四个字节)的数据
	@ STRB R1, [R2]  内存中写入'B'一个字节的数据'F1'
	@ STRH R1, [R2]  内存中写入'H'两个字节的数据'FFF1'
	@ R2->0x40000000内存空间 = R1的数据
读内存
	@ MOV R1, #0xFFFFFFF1
	@ MOV R2, #0x40000000
	@ LDR R3, [R2]	R3 = 默认内存读出一个字(四个字节)的数据
	@ LDRB R3, [R2]	R3 = 内存读出一个字节的数据
	@ LDRH R3, [R2]	R3 = 内存读出两个字节的数据
	@ R3 = R2->0x40000000内存空间的数据

2)ARM指令的寻址方式

寻址方式就是CPU去寻找操作数的方式

立即寻址

@ MOV R1, #1
@ ADD R1, R2, #1

寄存器寻址

@ ADD R1, R2, R3

寄存器移位寻址

@ MOV R1, R2, LSL #1

寄存器间接寻址

@ STR R1, [R2]

基址加变址寻址
		@ MOV R1, #0xFFFFFFFF
		@ MOV R2, #0x40000000
		@ MOV R3, #4
		@ STR R1, [R2,R3]
		@ 将R1寄存器中的数据写入到R2+R3指向的内存空间
		@ STR R1, [R2,R3,LSL #1]
		@ 将R1寄存器中的数据写入到R2+(R3<<1)指向的内存空间
基址加变址寻址的索引方式

前索引

		@ MOV R1, #0xFFFFFFFF
		@ MOV R2, #0x40000000
		@ STR R1, [R2,#8]
		@ 将R1寄存器中的数据写入到R2+8指向的内存空间
		@ LDR R2, [R2,#8]
		@ 将R2+8指向的内存空间的数据写入到R2寄存器中

后索引

		@ MOV R1, #0xFFFFFFFF
		@ MOV R2, #0x40000000
		@ STR R1, [R2],#8
		@ 将R1寄存器中的数据写入到R2指向的内存空间,然后R2自增8
		@ LDR R1, [R2],#8
		@ 将R2+8指向的内存空间的数据写入到R2寄存器中,然后R1自增8

自动索引

		@ MOV R1, #0xFFFFFFFF
		@ MOV R2, #0x40000000
		@ STR R1, [R2,#8]!
		@ 将R1寄存器中的数据写入到R2+8指向的内存空间,然后R2自增8
		@ LDR R6, [R2,#8]!
		@ 将R2+8指向的内存空间的数据写入到R6寄存器中,然后R6自增8
多寄存器内存访问指令的寻址方式

在这里插入图片描述

		@ MOV R1, #1
		@ MOV R2, #2
		@ MOV R3, #3
		@ MOV R4, #4
		@ MOV R11,#0x40000020
		@ STMIA R11!,{R1-R4}
		@ 先存储数据,后增长地址
		@ STMIB R11!,{R1-R4}
		@ 先增长地址,后存储数据
		@ STMDA R11!,{R1-R4}
		@ 先存储数据,后递减地址
		@ STMDB R11!,{R1-R4}
		@ 先递减地址,后存储数据

3)栈的种类与使用

栈的概念

栈的本质就是一段内存,程序运行时用于保存一些临时数据如局部变量、函数的参数、返回值、以及程序跳转时需要保护的寄存器等

栈的分类

在这里插入图片描述
增栈:压栈时栈指针越来越大,出栈时栈指针越来越小
减栈:压栈时栈指针越来越大,出栈时栈指针越来越小
满栈:栈指针指向最后一次压入到栈中的数据,压栈时需要先移动栈指针到相邻位置然后再压栈
空栈:栈指针指向最后一次压入到栈中的数据的相邻位置,压栈时可直接压栈,之后需要将栈指针移动到相邻位置

栈分为空增(EA)、空减(ED)、满增(FA)、满减(FD)四种
ARM处理器一般使用满减栈

		MOV R1, #1
		MOV R2, #2
		MOV R3, #3
		MOV R4, #4
		MOV R11,#0x40000020
		STMFD R11!,{R1-R4}
		LDMFD R11!,{R6-R9}
		
@ 结果 R6 = 1, R7 = 2, R8 = 3, R9 = 4

栈的应用举例

1.叶子函数的调用过程举例

@ 初始化栈指针
		MOV SP, #0x40000020
MIAN:
		MOV R1, #3
		MOV R2, #5
		BL  FUNC
		ADD R3, R1, R2
		B STOP
		
FUNC:
		@ 压栈保护现场
		STMFD SP!, {R1,R2}
		MOV R1, #10
		MOV R2, #20
		SUB R3, R2, R1
		@ 出栈恢复现场
		LDMFD SP!, {R1,R2}
		MOV PC, LR

2.非叶子函数的调用过程举例

		MOV SP, #0x40000020
MIAN:
		MOV R1, #3
		MOV R2, #5
		BL  FUNC1
		ADD R3, R1, R2
		B STOP		
FUNC1:
		STMFD SP!, {R1,R2,LR}
		MOV R1, #10
		MOV R2, #20
		BL  FUNC2
		SUB R3, R2, R1
		LDMFD SP!, {R1,R2,LR}
		MOV PC, LR
FUNC2:
		STMFD SP!, {R1,R2}
		MOV R1, #7
		MOV R2, #8
		MUL R3, R1, R2
		LDMFD SP!, {R1,R2}
		MOV PC, LR
		
		@ 执行叶子函数时不需要对LR压栈保护,执行非叶子函数时需要对LR压栈保护

四、状态寄存器传送指令

状态寄存器传送指令:访问(读写)CPSR寄存器

	@ 读CPSR
	MRS R1, CPSR
	@ R1 = CPSR
		
	@ 写CPSR
	MSR CPSR, #0x10
	@ CPSR = 0x10
		
	@ 在USER模式下不能随意修改CPSR,因为USER模式属于非特权模式
	MSR CPSR, #0xD3

五、软中断指令

软中断指令: 触发软中断异常
SWI #1

@ 设置异常向量表的地址
		B MAIN
		B .
		B SWI_HANDLER
		B .
		B .
		B .
		B .
		B .
		
		@ 应用程序
MAIN:
		MOV SP, #0x40000020
		初始化SVC模式下的栈指针,因为程序刚启动时模式为SVC模式
		MSR CPSR, 0x10
		@ 切换成user模式,开启FIQ、IRQ
		MOV R1, #3
		MOV R2, #5
		SWI #1
		@ 触发软中断模式
		ADD R3, R1, R2
		B STOP

		@ 异常处理程序
SWI_HANDLER:
		STMFD SP!, {R1, R2, LR}  
		@ 压栈保护现场
		MOV R1, #4
		MOV R2, #5
		MUL R3, R1, R2
		LDMFD SP!, {R1, R2, PC}^  
		@ 出栈恢复现场
		@ 将压入到栈中的LR(返回地址)出栈给PC,实现程序的返回
		@ ‘^’表示出栈的同时将SPSR的值传递给CPSR,实现CPU状态的恢复
	
	STOP:
		B STOP	

六、协处理器指令

协处理器指令: 操控协处理器的指令

	@ 1.协处理器数据运算指令
	CDP
	@ 2.协处理器存储器访问指令
	STC		@ 将协处理器中的数据写入到存储器
	LDC		@ 将存储器中的数据读取到协处理器
	@ 3.协处理器寄存器传送指令
	MRC		@ 将协处理器中寄存器中的数据传送到ARM处理器中的寄存器
	MCR		@ 将ARM处理器中寄存器中的数据传送到协处理器中的寄存器

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

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

相关文章

弱监督语义分割伪标签可视化(把单通道灰度图转为voc格式语义分割标签的彩色形式)

一、目的 以图片2007_001960为例&#xff0c;voc数据集中的原图和对应的语义分割标签分别如下&#xff1a; 图1 图2 图像级标签WSSS任务第一阶段最后生成的pseudo mask如下&#xff1a; 图3 我们的…

【100天精通python】Day22:字符串常用操作大全

目录 专栏导读 一、 字符串常用操作 1 拼接字符串 2 计算字符串长度 3 截取字符串 4 分割合并字符串 5 检索字符串 6 字母的大小写转换 7 去除字符串的空格和特殊字符 8 格式化字符串 二 、字符串编码转换 2.1 使用encode()方法编码 2.2 使用decoder()方法编码 专栏…

深度学习笔记-暂退法(Drop out)

背景 在机器学习的模型中&#xff0c;如果模型的参数太多&#xff0c;而训练样本又太少&#xff0c;训练出来的模型很容易产生过拟合的现象。在训练神经网络的时候经常会遇到过拟合的问题&#xff0c;过拟合具体表现在&#xff1a;模型在训练数据上损失函数较小&#xff0c;预…

Grandle安装配置(8.2.1)-windows环境

一、官网地址 https://gradle.org/releases/ 下载链接&#xff1a; https://downloads.gradle.org/distributions/gradle-8.2.1-bin.zip 下载后解压到指定文件夹,实例安装目录为&#xff1a; D:\ProgramFiles\gradle-8.2.1 二、配置环境变量 示例中配置的目录为&#xff1a…

二十一章:PUZZLE-CAM:通过匹配局部和全局特征来改进定位

0.摘要 弱监督语义分割&#xff08;WSSS&#xff09;被引入来缩小从像素级监督到图像级监督的语义分割性能差距。大多数先进的方法是基于类激活图&#xff08;CAM&#xff09;来生成伪标签以训练分割网络。WSSS的主要局限性在于从使用图像分类器的CAM生成伪标签的过程主要集中在…

【测试设计】基于正交法的测试用例设计工具--PICT

目录 前言 下载安装 用例生成 使用示例 具体操作&#xff1a; 资料获取方法 前言 我们都知道成对组合覆盖是一种非常有效的测试用例设计方法&#xff0c;但是实际工作过程中当成对组合量太大&#xff0c;我们往往很难做到有效的用例覆盖。 PICT是微软公司出品的一款成对…

spark-sql数据重复之File Output Committer问题

前言 我们先来回顾下之前介绍过的三种Committer&#xff1a;FileOutputCommitter V1、FileOutputCommitter V2、S3A Committer&#xff0c;其基本代表了整体的演进趋势。 核心代码讲解详细参照&#xff1a;Spark CommitCoordinator 保证数据一致性 OutputCommitter commitTask…

集群部署dolphinscheduler踩坑

本文主要总结一下最新版dolphinscheduler3.1.5的安装过程中遇到的坑。 dolphinscheduler启动报错 Exception in thread "Master-Server" org.springframework.beans.factory.BeanCreationException: Error creating bean with name masterServer: Invocation of in…

先进先出法与加权平均法的比较

加权平均法 加权平均的成本核算方法在计算销货成本和期末库存价值时使用每个库存物料的平均成本。企业将使用以下公式计算每个库存单位&#xff08;在特定会计期间内&#xff09;的平均成本&#xff1a; 平均库存成本 &#xff08;所有采购商品的总成本&#xff09;/&#xff…

Matlab Optimization Toolbox中的遗传算法工具包(GA)

matlab optimization 中使用了GA求解器 默认的是小于等于 找到GA 工具包 找到 APP选择 Optimization Tool 选择Solver ga - Genetic Algorithm 应用GA solver 定义适应度函数(Fitness function)与问题约束(Constraints) example one 优化函数 sin(x) 2 * cos(x)极其重要的…

【原创】IPTVC2实现方案(文末有demo)

前言: 名词解释: IPTVC2, 全称: 央视国际节目定价发布接口规范,标准版本当前最新为2.7.12 附赠资源链接&#xff0c;侵删:规范 规范中提供的样例&#xff0c;实现基于axis1.4(2006的时代宠物) 基于axis1版本的实现参考: Spring boot 集成Axis1.4 &#xff0c;使用wsdd文件发…

C语言每日一题:12《数据结构》相交链表。

题目&#xff1a; 题目链接 思路一&#xff1a; 1.如果最后一个节点相同说明一定有交点。 2.使用两个循环获取一下长度&#xff0c;同时可以获取到尾节点。 3。注意初始化lenA和lenB为1&#xff0c;判断下一个节点是空是可以保留尾节点的。长度会少一个&#xff0c;尾节点没有…

【C++修炼之路】多态

&#x1f451;作者主页&#xff1a;安 度 因 &#x1f3e0;学习社区&#xff1a;StackFrame &#x1f4d6;专栏链接&#xff1a;C修炼之路 文章目录 一、概念二、定义和实现1、虚函数2、虚函数的重写3、多态的构成条件4、重写的例外5、C11 override 和 final6、不能被继承的类7…

RxJava异步编程初探

RxJava 其实就是提供一套异步编程的 API&#xff0c;这套 API 是基于观察者模式的&#xff0c;而且是链式调用的&#xff0c;所以使用 RxJava 编写的代码的逻辑会非常简洁。 RxJava 有以下三个基本的元素&#xff1a; 被观察者&#xff08;Observable&#xff09;观察者&…

prometheus+grafana进行服务器资源监控

在性能测试中&#xff0c;服务器资源是值得关注一项内容&#xff0c;目前&#xff0c;市面上已经有很多的服务器资 源监控方法和各种不同的监控工具&#xff0c;方便在各个项目中使用。 但是&#xff0c;在性能测试中&#xff0c;究竟哪些指标值得被关注呢&#xff1f; 监控有…

SqlSugar、Freesql、Dos.ORM、EF、四种ORM框架的对比

SqlSugar、Freesql、Dos.ORM、EF、四种ORM框架的对比 一、默认情况下,导航属性是延迟查询; 答:ORM(Object-relational mapping)即对象关系映射,是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。也就是说,ORM是通过使用描述对象和数据库之间映射的元数据…

线程状态

从卖包子的案例学习进程间的通信 public class Test {public static void main(String[] args) {Object objnew Object();Thread th1new Thread(){Overridepublic void run() {synchronized (obj){System.out.println("来三个包子&#xff01;");try {obj.wait(); /…

IDEA删除本地git仓库、创建本地git仓库、关联其他仓库并上传

IDEA删除本地git仓库、创建本地git仓库、关联其他仓库并上传 删除本地Git仓库 创建本地Git仓库 关联其他仓库并上传 要在IntelliJ IDEA中删除本地Git仓库并创建新的本地Git仓库&#xff0c;以及关联其他仓库并上传&#xff0c;请按照以下步骤进行操作&#xff1a; 删除本地G…

【笔记】数据结构与算法 python-03-列表查找

列表查找 在一个数据结构中&#xff0c;通过一定的方法找出与给定关键字相同的数据元素的过程。 列表查找&#xff08;线性表查找&#xff09;&#xff1a;从列表&#xff08;一种线性数据结构&#xff0c;元素按照一定的顺序存储&#xff0c;每个元素都有一个唯一的位置索引…

网络出口技术中的单一出口网络结构,你会用吗?

我们在设计一个园区网络的时候&#xff0c;园区网络的出口需要和运营商的网络进行对接&#xff0c;从而提供internet服务。 在和运营商网络对接的时候&#xff0c;一般采用如下3终方式&#xff1a; 单一出口网络结构 1、网络拓扑 终端用户接入到交换机&#xff0c;交换机直…