ARM汇编指令之数据操作指令

  • 数据搬移指令:
  • 立即数:
  • 在待判断的32位数(以十六进制展开)中,寻找一个0~255(即0x00~0xff)之间的数值,然后将这个数值循环右移偶数个位置,可以得到待判断的数,即为立即数
	mov //将第二个操作数直接赋值给目标寄存器
    
    mvn //将第二个操作数按位取反,然后再赋值给目标寄存器
  • 示例代码:
	.text        
	.global _start        
	_start: 
		
		mov r0, #0x0000ff00 @第二个操作数为立即数,立即数前需要添加“#”
		mov r1, r0 @实现功能:r1 = r0 = 0x0000ff00
		
		mvn r2, #0x0000ff00 @r2 = ~0x0000ff00 = 0xffff00ff
		
		mvn r3, r2 @ r3 = ~r2 = 0x0000ff00
		
		stop:
			
			b stop
	  
	
	.end
	
  • 运行结果:
    在这里插入图片描述
  • ldr伪指令:
  • 示例代码:
	.text        
	.global _start        
	_start: 
		
		ldr r0, =0x52985298 @数值可以是0~4G(0~2^32)之间的任意数
		
		stop:
			
			b stop
	  
	
	.end
	
	
  • 运行结果:
    在这里插入图片描述
  • 移位操作指令:
lsl //逻辑左移或者无符号左移
lsr //逻辑右移或者无符号右移
asr //算数右移或者有符号右移
ror //循环右移
  • 示例代码:
	.text        
	.global _start        
	_start: 
		
		/*
		lsl //逻辑左移或者无符号左移
		lsr //逻辑右移或者无符号右移
		asr //算数右移或者有符号右移
		ror //循环右移
		*/
		@逻辑左移:高位移位,低位补0
		ldr r0, =0x000000ff
		
		lsl r1,r0, #4 @ r1 = r0 << 4 = 0x00000ff0
		
		@逻辑右移:低位移出,高位补0
		
		lsr r2,r0, #4 @ r2 = r0 >> 4 = 0x0000000f
		
		@算数右移:低位移出,高位补符号位
		mov r3,#-0xff @ r3 = 0xffffff01
		asr r4,r3, #4 @ r4 = 0xfffffff0
		
		@循环右移:低位移出,补到高位
		ror r5,r0, #8 @ r5 = 0xff000000
		stop:
			
			b stop
	  
	
	.end
	
  • 运行结果:
    在这里插入图片描述

  • 位运算指令:

  • 记忆技巧:

  • 与0清0,与1不变;

  • 或1置1,或0不变;

  • 异或1取反,异或0不变;

	and  //按位与(&)
	orr  //按位或(|)
	eor  //按位异或(^)
	bic  //按位清除的指令
  • 示例代码:
	.text        
	.global _start        
	_start: 
		
		ldr r0, = 0x12345678
		@将r0寄存器的第7位置1
		orr r0,r0,#(0x1 << 7)
		@orr r0,r0, #(1 << 7)
		@orr r0,r0, #0x80
		@将r0寄存器的第27位清零,并保证其他位不变,新的操作数移到r1
		and r0,r0,#(~(0x1 << 27))
		mov r1,r0
		@将r0寄存器的第20位到第25位置1,并保证其他位不变,新的操作数移到r2
		
		orr r0,r0,#(0x3f << 20)
		mov r2,r0
		
		@将r0寄存器的第12位到第18位清0,并保证其他位不变,新的操作数移到r3
		and r0,r0, #(~(0x7f << 12))
		mov r3,r0
		
		@将r0寄存器的第11位到第4位修改为0b01101101,并保证其他位不变,新的操作数移到r4
		and r0,r0, #(~(0xff << 4))
		orr r0,r0, #(0x6d << 4)
		mov r4,r0
		
		@若第一个寄存器和目标寄存器的编号相同时,可以合并,只写一个寄存器即可
		orr r0, #(0x1 << 7) @ r0 |= (0x1 << 7)
		mov r5,r0
		
		@将r0寄存器的第7位清0
		bic r0, #(0x1 << 7)
		mov r6,r0
		
		
		stop:
			
			b stop
	  
	
	.end
	
	
  • 运行结果:
    在这里插入图片描述

  • 算数运算指令:

	add //普通加法指令,不需要考虑进位标志位(C位)
	adc //带进位的加法指令,需要考虑进位标志位(C位)
	sub //普通减法指令,不需要考虑借位标志位(C位)
	sbc //带借位的减法指令,需要考虑借位标志位(C位)
	mul //乘法指令
	div //除法指令(ARM-v8之后的架构支持除法指令)
  • 示例代码:
	.text        
	.global _start        
	_start: 
		/* 案例1:实现两个64位数据的加法运算
	    第1个64位数据,低32位保存到R0中,高32位保存到R1中;
	    第2个64位数据,低32位保存到R2中,高32位保存到R3中;
	    运算结果:低32位保存到R4中,高32位保存到R5中; */
	    
	    @ 1. 准备264位数据
	    mov r0, #0xFFFFFFFE  @ 第164位数据的低32位
	    mov r1, #0x5   @ 第164位数据的高32位
	    mov r2, #0x6   @ 第264位数据的低32位
	    mov r3, #0x7   @ 第264位数据的高32位
	    
		 @ 低32位的加法运算
		 adds r4, r0, r2   @ r4 = r0 + r2 = 0x0000_0004
		 
		 @ 高32位的加法运算  @ r5 = r1 + r3 + C = 0x0000_000D
		 adc r5, r1, r3
			
		 /* 案例1:实现两个64位数据的减法运算
			第1个64位数据,低32位保存到R0中,高32位保存到R1中;
			第2个64位数据,低32位保存到R2中,高32位保存到R3中;
			运算结果:低32位保存到R4中,高32位保存到R5中; */
		 @ 1. 准备264位数据
			mov r0, #0x4      @ 第164位数据的低32位
			mov r1, #0xF   @ 第164位数据的高32位
			mov r2, #0x6   @ 第264位数据的低32位
			mov r3, #0x7   @ 第264位数据的高32位
		 
		 @ 低32位减法运算
		 subs r4, r0, r2        @ r4 = r0 - r2 = 0xFFFF_FFFE
		 sbc  r5, r1, r3        @ r5 = r1 - r3 - !C = 0x0000_0007
		 
		 @ 案例3:乘法指令
		 mov r0, #3
		 mov r1, #4
		 mul r2, r0, r1    @ r2 = r0 * r1 = 0xC
		 
		 @ 乘法指令的第二个操作数只能是一个寄存器
		 @ mul r3, r0, #5  @ Error
		
		stop:
			
			b stop
	  
	
	.end
		
	
  • 运行结果:
    在这里插入图片描述

  • 比较指令:

  • 功能:比较两个数的大小 ;

  • 本质:比较指令的本质做减法运算;

  • 比较指令没有目标寄存器,指令的执行结果影响的是CPSR的NZCV位,并且不需要加S;

  • 比较指令经常和条件码配合使用,实现汇编指令的有条件执行;

	cmp //比较两个数的大小
  • 示例代码:
	.text        
	.global _start        
	_start: 
		
		mov r0, #16
		mov r1, #19
		mov r2, #16
		mov r3, #19
		
		cmp r1,r0
		
		subhi r1,r1,r0  @无符号大于
		
		cmp r2,r3
		subcc r3,r3,r2	@无符号小于
		
		
		stop:
			
			b stop
	  
	
	.end
	
	
  • 运行结果:
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【期中复习】深度学习

文章目录 机器&#xff08;深度&#xff09;学习的四大核心要素为什么深度学习&#xff0c;不增加网络宽度黑盒模型的问题计算图线性神经网络梯度下降学习率优化方法softmax函数用于多分类交叉熵线性回归与softmax回归的对比为什么需要非线性激活函数感知机线性回归、softmax回…

2023版 STM32实战12 IIC总线读写AT24C02

IIC简述 一个多主从的串行总线&#xff0c;又叫I2C&#xff0c;是由飞利浦公司发明的通讯总线 IIC特点 -1- 串行(逐bit传输) -2- 同步(共用时钟线) -3- 半双工(收发不同进行) -4- 总线上的任何设备都可以是主机 开发使用习惯和理解 -1- 通过地址寻址 -2- 数据线的…

「网络编程」数据链路层协议_ 以太网协议学习

「前言」文章内容是数据链路层以太网协议的讲解。 「归属专栏」网络编程 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、以太网协议简介二、以太网帧格式&#xff08;报头&#xff09;三、MTU对上层协议的影响四、ARP协议4.1 ARP协议的作用4.2 ARP协议报头 一、以太网协…

基于单片机的IC卡门禁系统设计

收藏和点赞&#xff0c;您的关注是我创作的动力 文章目录 概要 一、主要研究内容及总体设计方案1.1 系统方案设计1.2系统工作原理 二、硬件设计2.1 主控电路 三、软件设计3.2主程序设计实物附录1 原理图附录2 源程序清单 四、 结论五、 文章目录 概要 本论文重点通过对射频技术…

小米14系列, OPPO Find N3安装谷歌服务框架,安装Play商店,Google

10月26号小米发布了新款手机小米14,那么很多大家需求问是否支持谷歌服务框架,是否支持Google Play商店gms。因为毕竟小米公司现在安装的系统是HyperOS澎湃OS。但是我拿到手机之后会发现还是开机初始界面会显示power by android,证明这一点他还是支持安装谷歌,包括最近一段时间发…

公司电脑如何限制安装软件

公司电脑如何限制安装软件 安企神终端管理系统下载使用 在企业环境中&#xff0c;电脑已经成为企业中必不可少的办公工具&#xff0c;确保员工的生产力和公司的信息安全是至关重要的。为了实现这一目标&#xff0c;公司可能会限制员工在某些情况下安装软件或者由管理员来为终…

一个Entity Framework Core的性能优化案例

概要 本文提供一个EF Core的优化案例&#xff0c;主要介绍一些EF Core常用的优化方法&#xff0c;以及在优化过程中&#xff0c;出现性能反复的时候的解决方法&#xff0c;并澄清一些对优化概念的误解&#xff0c;例如AsNoTracking并不包治百病。 本文使用的是Dotnet 6.0和EF…

TVRNet网络PyTorch实现

文章目录 文章地址网络各层结构代码实现 文章地址 An End-to-End Traffic Visibility Regression Algorithm文章通过训练搜集得到的真实道路图像数据集&#xff08;Actual Road dense image Dataset, ARD&#xff09;&#xff0c;通过专业的能见度计和多人标注&#xff0c;获得…

Qt QWebEngine 更换语言

背景 使用Qt QWebEngine开发的应用&#xff0c;在一些场景下&#xff0c;会显示英文文本&#xff0c;比如右键、JS弹出的对话框&#xff0c;所以需要进行汉化&#xff0c;更改语言。 准备翻译文件 Qt有提供翻译好的ts文件&#xff0c;我们可以直接下载ts文件qtwebengine_zh_…

世界前沿技术发展报告2023《世界航空技术发展报告》(二)军用飞机技术

&#xff08;二&#xff09;军用飞机技术 1.作战飞机1.1 美俄对第五代战斗机进行升级改进1.2 美欧第六代战斗机技术取得新进展1.3 美国B-21隐身轰炸机正式亮相 2.支援飞机2.1 美国空军拟研制翼身融合布局运输/加油机2.2 美欧厂商积极参加北约未来预警机技术研究项目2.3 美国空军…

1817_ChibiOS的RT线程

全部学习汇总&#xff1a; GreyZhang/g_ChibiOS: I found a new RTOS called ChibiOS and it seems interesting! (github.com) 1. 关于线程&#xff0c;有几个概念需要弄清楚&#xff1a;声明、生命循环、延迟、线程引用、线程队列、线程时间、优先级管理、调度。 2. 两个声明…

线性表的定义和基本操作

线性表的定义和基本操作 一、线性表的定义 线性表&#xff08;Linear List&#xff09;是具有相同数据类型的n(n>0)个数据元素的有限序列&#xff0c;其中n为表长&#xff0c;当n0时线性表是一个空表。若用L命名线性表&#xff0c;则其一般表示为 L (a1,a2,...,ai,ai1,.…

JMeter + Ant + Jenkins持续集成-接口自动化测试

需要安装的工具&#xff1a; jdk1.8jmeter3.2ant1.9jenkins2.1 1、Jdkwin7系统如何安装jdk及环境变量的配置-百度经验 安装包安装设置环境变量验证是否安装正确 Java -version检查&#xff0c;如下就代表安装成功了&#xff0c;环境变量设置就去搜索了&#xff0c;网上很多…

TimeGPT:时间序列预测的第一个基础模型

时间序列预测领域在最近的几年有着快速的发展&#xff0c;比如N-BEATS、N-HiTS、PatchTST和TimesNet。 大型语言模型(llm)最近在ChatGPT等应用程序中变得非常流行&#xff0c;因为它们可以适应各种各样的任务&#xff0c;而无需进一步的训练。 这就引出了一个问题:时间序列的…

File相关方法2

一.获取当前目录下所有一级文件名称 1.代码 package org.example;import java.io.File;public class day03 {public static void main(String[] args) {//获取当前目录下所有一级文件名称final File f1 new File("d:/temp");final String[] name f1.list();for (…

VDA到Excel方案介绍之自定义邮件接收主题

VDA标准是德国汽车工业协会&#xff08;Verband der Automobilindustrie&#xff0c;简称VDA&#xff09;制定的一系列汽车行业标准。这些标准包括了汽车生产、质量管理、供应链管理、环境保护、安全性能等方面的规范和指南。VDA标准通常被德国和国际上的汽车制造商采用&#x…

学习笔记:二分图

二分图 引入 二分图又被称为二部图。 二分图就是可以二分答案的图。 二分图是节点由两个集合组成&#xff0c;且两个集合内部没有边的图。换言之&#xff0c;存在一种方案&#xff0c;将节点划分成满足以上性质的两个集合。 性质 如果两个集合中的点分别染成黑色和白色&am…

目录和文件操作

在自己电脑任一盘符中新建以OS_Test命名的文件夹&#xff0c;并在该文件夹中新建新建3个以.txt&#xff0c;3个 .xlsx为扩展名的文件&#xff08;文件名由代码随机生成&#xff0c;长度为8&#xff0c;由字母数字组成&#xff09;。&#xff0c;请写一个程序&#xff0c;删除掉…

stm32的ADC采样率如何通过Time定时器进行控制

ADC采样率是个跟重要的概念. 手册上说可以通过Timer定时器进行触发ADC采样. 可我这边悲剧的是, 无论怎么样. ADC都会进行采样. 而且就算是TIM停掉也是一样会进行采样. 这就让我摸不着头脑了… 我想通过定时器动态更改ADC的采样频率. 结果不随我愿… 这到底是什么问题呢? 一…

el-table(vue2中)滚动条被固定列盖住

一、项目场景&#xff1a; vue2 el-table 二、问题描述 1、现场图片&#xff1a; 2、全局css环境配置了滚动条高度为6px /* 全局滚动条配置 */ ::-webkit-scrollbar {width: 6px;height: 6px; }::-webkit-scrollbar-track {background-color: #f1f1f1; }::-webkit-scrollbar-…