ARM的数据处理指令、跳转指令与储存器访问指令

news2024/7/6 17:50:29

最开始在此介绍一下CPSR寄存器中 N、Z、C、V 4位的作用:

Bit[28](V):

  • 当运算器中进行加法运算且产生符号位进位时该位自动置1,否则为0    
  • 当运算器中进行减法运算且产生符号位借位时该位自动置0,否则为1  

Bit[29](C):     

  • 当运算器中进行加法运算且产生进位时该位自动置1,否则为0    
  • 当运算器中进行减法运算且产生借位时该位自动置0,否则为1

Bit[30](Z):当运算器中产生了0的结果该位自动置1,否则为0  

Bit[31] (N):当运算器中产生了负数的结果该位自动置1,否则为0
 

汇编条件码合集:

 

汇编的简介与指令的具体应用全部放在汇编代码中介绍!!

在此简单做一下指令的总结:

  • MOV:数据搬移
  • ADD:加法
  • SUB:减法
  • RSB:逆向减法
  • MUL:乘法
  • AND:按位与
  • ORR:按位或
  • EOR:按位异或
  • LSL:左移
  • LSR:右移
  • BIC:位清零
@ *****************************************************************

@ 汇编中的符号
	@ 1.指令:	能够编译生成一条32位的机器码,且能被CPU识别和执行
	@ 2.伪指令:本身不是指令,编译器可以将其替换成若干条等效指令
	@ 3.伪操作:不会生成代码,只是在编译之前告诉编译器怎么编译
	
@ ARM指令
	@ 1.数据处理指令:		数学运算、逻辑运算
	@ 2.跳转指令:			实现程序的跳转,本质就是修改了PC寄存器
	@ 3.Load/Srore指令:	访问(读写)内存
	@ 4.状态寄存器传送指令:访问(读写)CPSR寄存器
	@ 5.软中断指令:		触发软中断异常
	@ 6.协处理器指令:		操控协处理器的指令

@ *****************************************************************

.text				@表示当前段为代码段
.global _start		@声明_start为全局符号
_start:				@汇编程序的入口

@ 1.指令:能够编译生成一条32位的机器码,且能被CPU识别和执行

	@ 1.1 数据处理指令:数学运算、逻辑运算
	
		@ 数据搬移指令
		
		@ MOV R1, #1
		@ R1 = 1
		@ MOV R2, R1
		@ R2 = R1
		
		@ MVN R0, #0xFF 
		@ R0 = ~0xFF
		
		@ 立即数
		@ 立即数的本质就是包含在指令当中的数,属于指令的一部分
		@ 立即数的优点:取指的时候就可以将其读取到CPU,不用单独去内存读取,速度快
		@ 立即数的缺点:不能是任意的32位的数字,有局限性
		@ MOV R0, #0x12345678
		@ MOV R0, #0x12
		
		@ 编译器替换
		@ MOV R0, #0xFFFFFFFF
		
		@ 数据运算指令基本格式
		@	《操作码》《目标寄存器》《第一操作寄存器》《第二操作数》
		@		操作码			指示执行哪种运算
		@		目标寄存器:	存储运算结果
		@		第一操作寄存器:第一个参与运算的数据(只能是寄存器)
		@		第二操作数:	第二个参与运算的数据(可以是寄存器或立即数)
		
		@ 加法指令
		@ MOV R2, #5
		@ MOV R3, #3
		@ ADD R1, R2, R3
		@ R1 = R2 + R3
		@ ADD R1, R2, #5
		@ R1 = R2 + 5
		
		@ 减法指令
		@ SUB R1, R2, R3
		@ R1 = R2 - R3
		@ SUB R1, R2, #3
		@ R1 = R2 - 3
		
		@ 逆向减法指令
		@ RSB R1, R2, #3
		@ R1 = 3 - R2
		
		@ 乘法指令
		@ MUL R1, R2, R3
		@ R1 = R2 * R3
		@ 乘法指令只能是两个寄存器相乘
		
		@ 按位与指令
		@ 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,就将第一操作寄存器的中哪一位清零,然后将结果写入目标寄存器
		
		@ 格式扩展
		@ MOV R2, #3
		@ MOV R1, R2, LSL #1
		@ R1 = (R2 << 1)
		
		@ 数据运算指令对条件位(N、Z、C、V)的影响
		@ 默认情况下数据运算不会对条件位产生影响,在指令后加后缀”S“才可以影响
		
		@ 带进位的加法指令
		@ 两个64位的数据做加法运算
		@ 第一个数的低32位放在R1
		@ 第一个数的高32位放在R2
		@ 第二个数的低32位放在R3
		@ 第二个数的高32位放在R4
		@ 运算结果的低32位放在R5
		@ 运算结果的高32位放在R6
		
		@ 第一个数
		@ 0x00000001 FFFFFFFF
		@ 第二个数
		@ 0x00000002 00000005
		
		@ MOV R1, #0xFFFFFFFF
		@ MOV R2, #0x00000001
		@ MOV R3, #0x00000005
		@ MOV R4, #0x00000002
		@ ADDS R5, R1, R3
		@ ADC  R6, R2, R4
		@ 本质:R6 = R2 + R4 + 'C'
		
		@ 带借位的减法指令
		
		@ 第一个数
		@ 0x00000002 00000001
		@ 第二个数
		@ 0x00000001 00000005
		
		@ MOV R1, #0x00000001
		@ MOV R2, #0x00000002
		@ MOV R3, #0x00000005
		@ MOV R4, #0x00000001
		@ SUBS R5, R1, R3
		@ SBC  R6, R2, R4
		@ 本质:R6 = R2 - R4 - '!C'


	@ 1.2 跳转指令:实现程序的跳转,本质就是修改了PC寄存器
	
		@ 方式一:直接修改PC寄存器的值(不建议使用,需要自己计算目标指令的绝对地址)
@ MAIN:
		@ MOV R1, #1
		@ MOV R2, #2
		@ MOV R3, #3
		@ MOV PC, #0x18
		@ MOV R4, #4
		@ MOV R5, #5	
@ FUNC:
		@ MOV R6, #6
		@ MOV R7, #7
		@ MOV R8, #8
	
		@ 方式二:不带返回的跳转指令,本质就是将PC寄存器的值修改成跳转标号下指令的地址
@ MAIN:
		@ MOV R1, #1
		@ MOV R2, #2
		@ MOV R3, #3
		@ B   FUNC
		@ MOV R4, #4
		@ MOV R5, #5	
@ FUNC:
		@ MOV R6, #6
		@ MOV R7, #7
		@ MOV R8, #8
		
		@ 方式三:带返回的跳转指令,本质就是将PC寄存器的值修改成跳转标号下指令的地址,同时将跳转指令下一条指令的地址存储到LR寄存器
@ MAIN:
		@ MOV R1, #1
		@ MOV R2, #2
		@ MOV R3, #3
		@ BL  FUNC
		@ MOV R4, #4
		@ MOV R5, #5	
@ FUNC:
		@ MOV R6, #6
		@ MOV R7, #7
		@ MOV R8, #8
		@ MOV PC, LR
		@ 程序返回
		
		@ ARM指令的条件码
		
		@ 比较指令
		@ CMP指令的本质就是一条减法指令(SUBS),只是没有将运算结果存入目标寄存器
		@ MOV R1, #1
		@ MOV R2, #2
		@ CMP R1, R2
		@ BEQ FUNC	
		@ 执行逻辑:if(EQ){B FUNC}	本质:if(Z==1){B FUNC}
		@ BNE FUNC	
		@ 执行逻辑:if(NQ){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
			
	@ 1.3 Load/Srore指令:访问(读写)内存
	
		@ 写内存
		@ MOV R1, #0xFF000000
		@ MOV R2, #0x40000000
		@ STR R1, [R2] 
		@ 将R1寄存器中的数据写入到R2指向的内存空间
		
		@ 读内存
		@ LDR R3, [R2]
		@ 将R2指向的内存空间中的数据读取到R3寄存器
		
		@ 读/写指定的数据类型
		@ MOV R1, #0xFFFFFFFF
		@ MOV R2, #0x40000000
		@ STRB R1, [R2]
		@ 将R1寄存器中的数据的Bit[7:0]写入到R2指向的内存空间
		@ STRH R1, [R2] 	
		@ 将R1寄存器中的数据的Bit[15:0]写入到R2指向的内存空间
		@ STR  R1, [R2] 	
		@ 将R1寄存器中的数据的Bit[31:0]写入到R2指向的内存空间
		
		@ LDR指令同样支持以上后缀
		
		@ 寻址方式就是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指向的内存空间
		
		@ 后索引
		@ MOV R1, #0xFFFFFFFF
		@ MOV R2, #0x40000000
		@ STR R1, [R2],#8
		@ 将R1寄存器中的数据写入到R2指向的内存空间,然后R2自增8
		
		@ 自动索引
		@ MOV R1, #0xFFFFFFFF
		@ MOV R2, #0x40000000
		@ STR R1, [R2,#8]!
		@ 将R1寄存器中的数据写入到R2+8指向的内存空间,然后R2自增8
		
		@ 以上寻址方式和索引方式同样适用于LDR
		
		@ 多寄存器内存访问指令
		@ MOV R1, #1
		@ MOV R2, #2
		@ MOV R3, #3
		@ MOV R4, #4
		@ MOV R11,#0x40000020
		@ STM R11,{R1-R4}
		@ 将R1-R4寄存器中的数据写入到以R11为起始地址的内存空间中
		@ LDM R11,{R6-R9}
		@ 将以R11为起始地址的内存空间中的数据读取到R6-R9寄存器中
		
		@ 当寄存器编号不连续时,使用逗号分隔
		@ STM R11,{R1,R2,R4}
		@ 不管寄存器列表中的顺序如何,存取时永远是低地址对应小编号的寄存器
		@ STM R11,{R3,R1,R4,R2}
		@ 自动索引照样适用于多寄存器内存访问指令
		@ STM R11!,{R1-R4}
		
		@ 多寄存器内存访问指令的寻址方式
		@ 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}
		@ 先递减地址,后存储数据

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

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

相关文章

头歌计算机组成原理实验—运算器设计(6)第6关:5位无符号阵列乘法器设计

第6关&#xff1a;5位无符号阵列乘法器设计 实验目的 帮助学生掌握阵列乘法器的实现原理&#xff0c;能够分析阵列乘法器的性能&#xff0c;能在 Logisim 中绘制阵列乘法器电路。 视频讲解 实验内容 在 Logisim 中打开 alu.circ 文件&#xff0c;在5位阵列乘法器中实现斜向…

阿里云要分拆上市,腾讯云、百度云跟不跟?

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 十年磨一剑成就的阿里云开始兵行险招&#xff0c;在两年多来营收增速最低的一个财季&#xff0c;阿里云宣布开始分拆上市。 5月18日&#xff0c;阿里发布财报&#xff0c;在财报中宣布&#xff0c;阿里云将从阿里巴巴集团完…

[工具分享] 如何快速的添加海外客户的whatsApp和line进入通讯录

很多做外贸的朋友经常需要和海外的朋友联系&#xff0c;我们经常有时候需要添加海外客户的whatsApp和line等海外社交软件更好的与客户沟通&#xff0c;其他的App呢也是类似的,一下分享的方法 第一步、首先下载软件&#xff1a; 腾讯网盘&#xff1a;https://share.weiyun.com…

【已解决】grub引导项修复:Minimal BASH-like line editing is supported.

目录 1 问题背景2 问题探索3 问题解决4 告别Bug 1 问题背景 环境&#xff1a; Win10Ubuntu20.04 现象&#xff1a;双系统电脑向移动硬盘安装Ubuntu系统后&#xff0c;重启黑屏并显示Minimal BASH-like line editing is supported. For the first word, TAB lists possible comm…

入驻QQ一天就爆满,Midjourney中文版来了

目录 官方中文版上线&#xff0c;名额有限官方教程&#xff0c;详细可查社区内的优秀作品花式鼓励优秀创作者为你的创作保驾护航国内模式&#xff1a;当然少不了付费国内用户实现快速访问快去体验吧&#xff0c;「折腾没有消失&#xff0c;只是转移到了你的身上…」 国内用户终…

Windows环境下pcl点云库 安装配置全流程(精简、有效)

本文为Windows配置点云库pcl步骤&#xff0c;具体win10、visual studio 2019、pcl1.11.1。 目录 【1】下载安装包 【2】安装 2.1 先执行win64.exe 2.2 解压win64.zip 2.3 OpenNI2安装 【3】设置环境变量 【4】visual studio 项目实战 4.1 新建C空项目 4.2 包含目录 4…

c++STL—容器map/multimap

目录 1、map基本概念 1.1、简介 1.2、本质 1.3、优点 1.4、map和multimap区别 2、map构造和赋值 2.1、功能描述 2.2、函数原型 2.3、示例 3、map的大小和交换 3.1、功能描述 3.2、函数原型 3.3、示例 4、map插入和删除 4.1、功能描述 4.2、函数原型 4.3、示例…

【利用AI让知识体系化】解锁异步编程的新世界!

文章目录 I. 前言简介异步在计算机编程中的应用 II. 同步与异步定义与区别同步编程的缺点 III. 异步编程定义应用场景回调函数Promise对象async/await关键字事件循环 IV. 异步编程实例Node.js中使用异步编程异步HTTP请求实现异步文件操作 V. 异步编程的优势VI. 异步编程的挑战与…

Docker 运行 jenkins

概述 虚拟机启动Docker&#xff0c;运行Jenkins&#xff0c;进行代码拉取测试 实现功能&#xff1a; 1. 可链接外网 2. 可拉取仓库代码 3. 基本配置 部署 拉取镜像 docker search jenkins docker pull jenkins/jenkins 创建工作目录 # 创建目录 给工作挂载目录赋予权限 mk…

KingbaseES V8R6 数据库运维案例之 -- root用户securecmd连接'Permission denied'错误

案例分析&#xff1a; 在KingbaseES V8R6数据库在不支持ssh连接的系统环境&#xff0c;可以通过securecmdd服务建立主机之间的通讯&#xff0c;默认securecmdd服务建立用户之间的互信&#xff0c;通过publickey认证建立访问连接。在配置securecmdd服务后&#xff0c;默认kingba…

JavaScript实现计算1-100之间不能被7整除的数的和的代码

以下为实现计算1-100之间不能被7整除的数的和的程序代码和运行截图 目录 前言 一、实现计算1-100之间不能被7整除的数的和 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有选择&#xff0c;您可以在目录里进行快速查找&#xff1b; 2.…

【JavaWeb】--06.Filter、Listener、Ajax、Vue

文章目录 Filter1.概述2.快速入门2.1 开发步骤2.2 代码演示 3.Filter执行流程4. Filter拦截路径配置5.过滤器链5.1 概述5.2 代码演示5.3 问题 Listener1.概述2. 分类3.代码演示 Ajax1.概述1.1作用1.2 同步和异步 2.快速入门2.1 服务端实现2.2 客户端实现2.3 测试 3.axios3.1 基…

MVC 三层架构案例详细讲解

MVC 三层架构案例详细讲解 文章目录 MVC 三层架构案例详细讲解每博一文案1. MVC 概述2. MVC设计思想3. 三层架构4. MVC 与 三层架构的关系&#xff1a;5. 案例举例&#xff1a;用户账户转账5.1 M&#xff08;Model &#xff1a;数据/业务处理层&#xff09;5.2 C (Controller :…

软件测试实验:Web应用测试

目录 前言Web应用的特点实验目的实验内容实验要求实验过程系统测试用例系统测试执行记录系统测试缺陷报告 总结 前言 软件质量保证与测试技术实验是一门旨在培养学生掌握软件测试的基本理论和方法的课程。本实验主要涉及Web应用测试&#xff0c;包括以下几个方面&#xff1a;一…

Scala初学者指南

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 文章目录 Scala跟Java的区别和联系Scala安装Scala中的数据类型Scala语法val和var泛型包导入包对象特质运算符传名参数implicitObject和Class样例类_(下划线)println集合ListMapRange 迭代器Tuple提取器对象流…

代码随想录 哈希表 Java

文章目录 &#xff08;简单&#xff09;242.有效的字母异位词&#xff08;简单&#xff09;383. 赎金信&#xff08;中等&#xff09;49. 字母异位词分组&#xff08;*中等&#xff09;438. 找到字符串中所有字母异位词&#xff08;简单&#xff09;349. 两个数组的交集&#x…

CyberLink的专业视频编辑软件ActionDirector Ultra 3.0版本在win10系统的下载与安装配置教程

目录 前言一、ActionDirector Ultra安装二、使用配置总结 前言 ActionDirector Ultra是CyberLink公司开发的专业视频编辑软件&#xff0c;旨在帮助用户创作高质量的运动和冒险视频。该工具提供了一些先进的特效和编辑工具&#xff0c;让用户能够轻松地剪辑、修剪、调整颜色和添…

队列实现栈(你看我讲的是不是最细的就完了)

最伟大的成就往往起源于最强烈的热情。 -- 诺曼文森特皮尔目录 &#x1f5fc;一.队列实现栈 &#x1f345;二.使用两个队列来模拟实现栈 &#x1f34b;1.栈结构体包含两个队列 &#x1f352;2.创建一个结构体的指针 &#x1f342;3.myStackPush入栈操…

【小沐学Python】Python实现Web图表功能(ECharts.js,Flask)

&#x1f388;&#x1f388;&#x1f388;Python实现Web图表功能系列&#xff1a;&#x1f388;&#x1f388;&#x1f388;1&#x1f388;【Web开发】Python实现Web图表功能&#xff08;D-Tale入门&#xff09;&#x1f388;2&#x1f388;【Web开发】Python实现Web图表功能&a…

编程不头秃,Google「AI程序员」来了,聊天就能敲代码

上周 Google 在 I/O 大会宣布了一个能够辅助编程的聊天机器人 Codey&#xff0c;现在它终于上线 Google Colab 啦&#xff01; &#x1f31f; Codey 是基于 Google 目前最新的大语言模型 PaLM 2 运行&#xff0c;有着强大的语言理解和编程能力。 Codey 有这些功能&#xff1…