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

news2024/11/15 21:40:58
  • 数据搬移指令:
  • 立即数:
  • 在待判断的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
	
	
  • 运行结果:
    在这里插入图片描述

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

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

相关文章

Vue $nextTick

我们用一个例子来说明$nextTick的作用&#xff1a; 我们用一个变量showIpt来控制input框的显示和隐藏&#xff0c;默认是隐藏。 我们点击一个按钮后显示这个输入框的同时&#xff0c;input还要自动获取焦点。 但是我们点击按钮过后并没有生效。 为什么&#xff1f;this.show…

C++标准模板(STL)- 类型支持 (类型特性,is_union,is_class,is_function)

类型特性 类型特性定义一个编译时基于模板的结构&#xff0c;以查询或修改类型的属性。 试图特化定义于 <type_traits> 头文件的模板导致未定义行为&#xff0c;除了 std::common_type 可依照其所描述特化。 定义于<type_traits>头文件的模板可以用不完整类型实例…

Ubuntu中查看电脑有多少个核——lscpu

1. 使用lscpu命令: 打开终端并输入以下命令: lscpu你会看到与CPU相关的详细信息。查找"CPU(s)"这一行来看总的核心数。另外&#xff0c;“Core(s) per socket”表示每个插槽或每个物理CPU的核数&#xff0c;“Socket(s)”表示物理CPU的数量。将这两个值相乘即得到总…

MyBatis开启二级缓存

MyBatis开启二级缓存 前言 MyBatis-Plus&#xff08;简称MP&#xff09;是一个基于MyBatis的增强工具&#xff0c;提供了更便捷的CRUD操作和其他功能。与MyBatis相比&#xff0c;MyBatis-Plus并没有引入自己的缓存机制&#xff0c;而是直接使用了MyBatis的缓存机制。 在MyBati…

【Linux】第五站:Linux权限

文章目录 一、shell命令以及运行原理二、Linux下用户的分类1.root用户和普通用户的切换2.对一条指令的提权 三、什么叫做权限1.权限2.文件的属性3.文件类型4.权限属性 四、更改权限1. chmod 更改文件的属性2. chown 更改拥有者3. chgrp更改所属组4.chown一次性更改拥有者和所属…

12种常见的恶意软件类型与防范建议

1、病毒 病毒是迄今为止最常见的恶意软件类型之一。它是一种能够感染、破坏计算机设备&#xff0c;并在其运行系统上自我复制的程序。由于病毒是自我复制的&#xff0c;一旦安装并运行&#xff0c;它们就可以在同一网络上自动从一台设备传播到另一台设备&#xff0c;无需人为干…

网络(番外篇)can网络知识

通常ECU发出的网络管理报文ID Base Address Node ID Mifa项目向外发的网络管理报文0x418&#xff0c;就是DBC根据基地址加上节点ID定义的。 报文属性是 NmAsrMessage即应答网络报文。 DBC里关于整个网络管理的参数定义&#xff0c;确定好后导入达芬奇&#xff0c;就是直接…

简单的谈谈VPN是什么、类型、使用场景以及工作原理?

作者&#xff1a;久孤776 个人主页&#xff1a;久孤776_python-CSDN博客 作者会持续更新网络知识以及关于python的知识期待你的关注 目录 一、vpn是什么 二、vpn的类型 1. 远程访问VPN 2. 点对点VPN 3. 入口站点VPN 4. 专线VPN 5. 客户端对站点VPN 三、VPN的使用场景 1…

通过python操作neo4j

在neo4j中创建结点和关系 创建结点 创建电影结点 例如&#xff1a;创建一个Movie结点&#xff0c;这个结点上带有三个属性{title:‘The Matrix’, released:1999, tagline:‘Welcome to the Real World’} CREATE (TheMatrix:Movie {title:The Matrix, released:1999, tagl…

从零开始:开发直播商城APP的技术指南

时下&#xff0c;直播商城APP已经成了线上购物、电子商务的核心组成&#xff0c;本文将为您提供一个全面的技术指南&#xff0c;帮助您从零开始开发一个直播商城APP。我们将涵盖所有关键方面&#xff0c;包括技术堆栈、功能模块、用户体验和安全性。 第一部分&#xff1a;技术…

Mybatis的Mapper文件报错:Tag name expected

目录 一、Mapper文件的错误信息 二、原因分析 三、解决方案 1、解决方式一&#xff1a;CDATA 2、解决方式二&#xff1a;预定义字符 一、Mapper文件的错误信息 在使用MyBatis时&#xff0c;我们通常会写一些sql语句。如下图&#xff0c;有时候我们会直接使用比较符号&…

继续畅通工程(最小生成树+并查集)

我刚开始的想法是&#xff0c;既然有已经修好的路&#xff0c;就先把这些修好的路全都加到集合中&#xff0c;即直接把他们Union&#xff0c;不加其长度&#xff0c;然后再将剩下的排序&#xff0c;按Kruskal的算法来进行。 但是这种想法可能有什么问题&#xff0c;只过了一般…

Vscode中不显示.ipynb文件单元格行号

找到设置&#xff0c;搜索line number&#xff1a; 看到下面那个Notebook: Line Numbers 控制单元格编辑器中行号的显示。&#xff0c;选择on即可&#xff1b;

网络原理之TCP/IP

文章目录 应用层传输层UDP协议TCP协议TCP 的工作机制1. 确认应答2. 超时重传3. 连接管理TCP 的建立连接的过程(三次握手),和断开连接的过程(四次挥手)TCP 断开连接, 四次挥手 3. 滑动窗口5. 流量控制6. 拥塞控制7. 延时应答8. 捎带应答9. 面向字节流10. 异常情况 本章节主要讨论…

CRM客户管理系统源码 带移动端APP+H5+小程序

CRM客户管理系统源码 带移动端APPH5小程序 开发环境: thinkphp mysql 功能介绍&#xff1a; 1、 办公管理&#xff1a;审批管理、工作报告、日程管理、办公审批、公告管理 2、 客户管理&#xff1a;我的客户、客户列表、成交客户、行业类别、预查、地区列表、客户状态、客…

嘴笨的技术人员怎么发言

对于嘴笨的人来说&#xff0c;即兴发言简直就是灾难&#xff0c;想想自己窘迫的模样&#xff0c;自己都受不了&#xff0c;但职场又避免不了这种场合&#xff0c;所以&#xff0c;就要靠一些技巧让我们顺利打开思路了。 那么&#xff0c;今天就分享几个解救过我的不同场景即兴发…

【优选算法系列】第一节.滑动窗口(209. 长度最小的子数组和3. 无重复字符的最长子串)

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;优选算法系列 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&#xff01…

结构体指针的引入

概念引入 结构体指针类似于前面学习过的指针&#xff0c;我们先回忆下指针&#xff1a;指针就是地址&#xff0c;指针变量就是存放地址的变量。而结构体也是变量&#xff0c;变量访问有两种方式:1.变量名&#xff0c; 2.地址&#xff0c;之前案例&#xff0c;是用变量名访问。…

rhcsa安装及配置

RHCSA LINUX 所需软件&#xff1a;VmwareWorkStation 16 rhel-baseos-9.0-x86_64-dvd 镜像文件 Xshell 远程终端工具 「链接&#xff1a;https://pan.xunlei.com/s/VNh9sAs1R591Vr2pounMmyyCA1?pwde42h# 提取码&#xff1a;e42h”复制这段内容后打开手机迅雷App&…

某赛驱动器调节工具DM-Series使用笔记

某赛驱动器调节工具DM-Series使用笔记 简介RJ11通讯定义DM-Series界面更改驱动盒的参数观察串口发送出去的数据得出结果CRC参数模型设置电流值与16进制值对照 简介 某赛驱动器的盒调节电流或其他参数。我以DM85x为例&#xff0c;通过串口通讯修改电流值大小&#xff0c;虽然可…