通用指令(汇编)

news2024/12/28 4:57:59

  • 一、数据处理指令
    • 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压栈保护

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

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

相关文章

RabbitMQ-API

这里写目录标题 Hello word 模式添加依赖生产者消费者获取信道工具类 Work Queues模式消费者代码 C1开启多线程运行启动 消费者代码 C2生产者代码 消息应答自动应答消息应答的方法Multiple 的解释消息自动重新入队消息手动应答代码消费者API 队列持久化消息持久化不公平分发消息…

思科模拟器配置静态路由(下一跳使用IP)

Router0配置代码&#xff1a;##端口配置 Router(config)#int fastEthernet 0/0 Router(config-if)#ip address 192.168.10.254 255.255.255.0 Router(config-if)#no shutdown Router(config-if)#int fastEthernet 0/1 Router(config-if)#ip address 192.168.20.1 255.255.255.2…

拼多多海外版Temu商业模式分析

拼多多于2022 年 9 月在美国上线跨境平台 Temu&#xff0c;发布仅2个月就成为北美下载量最高的应用程序&#xff0c;持续霸榜。 这篇文章帮你快速了解下Temu&#xff1a; 商业模式如何竞争情况如何有哪些优势和挑战后期业务如何发展 一、Temu商业模式 Temu平台拥有对商品的最…

如何一目了然地监控远程 Linux 系统

动动发财的小手&#xff0c;点个赞吧&#xff01; Glances 是一款免费的开源、现代、跨平台、实时 top 和类似 htop 的系统监控工具&#xff0c;与同类工具相比&#xff0c;它提供了先进的功能&#xff0c;并且可以在不同的模式下运行&#xff1a;作为独立模式、客户端/服务器模…

32.利用fmincon 解决 最小费用问题(matlab程序)

1.简述 fmincon函数非线性约束下的最优化问题 fmincon函数&#xff0c;既是求最小约束非线性多变量函数 该函数被用于求如下函数的最小值 语法如下: x fmincon(fun,x0,A,b) x fmincon(fun,x0,A,b,Aeq,beq) x fmincon(fun,x0,A,b,Aeq,beq,lb,ub) x fmincon(fun,x0,A,b,Aeq…

软件测试分类总结

目录 1.根据源代码可见度划分 1.1黑盒测试 1.2白盒测试 1.3灰盒测试 2.根据开发阶段划分 2.1单元测试 2.2集成测试 2.3系统测试 2.4验收测试 3.按照实施组织划分 3.1α测试 3.2β测试 3.3第三方测试 4.按照是否运行程序划分 4.1静态测试 4.2动态测试 5.根据软件测试工作的…

centos7 部署Tomcat和jpress应用

目录 一、静态、动态、伪静态 二、Web 1.0 和 Web 2.0 三、centos7 部署Tomcat 3.1 安装、配置jdk 3.2 安装 Tomcat 3.3 配置服务启动脚本 3.3.1 创建用户和组 3.3.2 创建tomcat.conf文件 3.3.3 创建服务脚本(tomcat.service) 3.3.4 重新加载守护进程并且测试 四、部…

P3373 【模板】线段树 2

题目 思路 作为线段树模板题&#xff0c;这题主要考查了对lazytag以及先乘后加的使用&#xff0c; 因为是模板&#xff0c;所以这里证明略 代码 #include<bits/stdc.h> using namespace std; #define int long long const int maxn1e55; int n,m,p; int a[maxn]; stru…

输出菱形的程序填空题补充代码问题

ABBBCCCCCDDDDDDDEEEF 如上图所示&#xff0c;补充以下代码&#xff0c;输出这个图形。 #include<stdio.h> #define N 7//图案共N行 #define L (80-N)/2//整个图案据屏幕左边L列&#xff0c;使其居中 int main() {char cA;int i,j,p;for(i1;i<N;i, ){if(i<(…

(12)理解委托,反射,Type,EvenInfo,插件, 组合枚举,BindingFlags,扩展方法及重载,XML认识

一、复习委托事件 1、委托复习。 private delegate int MyDelegate(int a, int b); //1.定义委托类型private static void Main(string[] args){MyDelegate md new MyDelegate(AddDelegate);//2.声明委托变量int result md(1, 2);//3.调用委托Console.WriteLine(result);Cons…

运维作业4

一.简述静态网页和动态网页的区别。 静态页面资源特征 1. 处理文件类型&#xff1a;如.html、jpg、.gif、.mp4、.swf、.avi、.wmv、.flv等 2. 地址中不含有问号"&#xff1f;"或&等特殊符号。 3. 保存在网站服务器文件系统上的&#xff0c;是实实在在保存在服务器…

十进制、八进制、二进制、十六进制

十进制 每一位都有 0~9 十个数码&#xff0c;逢十进一 二进制 每一位仅有 0 和 1 两个数码&#xff0c;逢二进一 八进制 每一位都有 0~7 八个数码&#xff0c;逢八进一 十六进制 每一位都有 0~9、A(10)、B(11)、C(12)、D(13)、E(14)、F(15)&#xff0c;十六个数码&#…

路由动态选择协议之RIP(路由信息协议)

软件&#xff1a;cicso packet tracer 8.0 拓扑图&#xff1a;路由器&#xff1a;Router-PT、连接线&#xff1a;Serial DTE、连接口&#xff1a;Serial口 1、配置基础ip R1配置&#xff1a;虚拟接口——1.1.1.1&#xff1b;S3/0——192.168.1.1 R1(config)#int s3/0 R1(con…

SQL Server数据库 -- 索引与视图

文章目录 一、索引 聚集索引非聚集索引二、视图三、自定义函数 标量函数表值函数四、游标五、总结 前言 在学习完创建库表、查询等知识点后&#xff0c;为了更加方便优化数据库的存储和内容&#xff0c;我们需要学习一系列的方法例如索引与视图等等&#xff0c;从而使我们更加…

快手头部主播合体,二驴祁天道直播首秀销售额破亿

2023年刚刚过半&#xff0c;直播江湖突然生变。 快手头部娱乐主播「二驴」与快手户外主播第一人「祁天道」宣布“合体”&#xff0c;两者加总的粉丝量接近1亿&#xff0c;又一个“超级网红IP”诞生。 ▲图源&#xff1a;二驴的、祁天道快手截图 从白手起家的草根&#xff0c;…

语义检索系统【四】:基于ERNIE-Gram的Pair-wise和基于RocketQA的CrossEncoder训练的单塔模型实现数据精排

搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术…

启动Flink显示初始化状态怎么解决?

启动Flink显示初始化状态怎么解决&#xff1f; Flink On Yarn模式 问题 flnk任务在跑的过程中&#xff0c; 有时候任务停掉了 &#xff0c;不过我有 定时任务&#xff0c;可以把失败的flink任务拉起来&#xff0c;但是因为最新的checkpoint做失败了&#xff0c;导致脚本无法拉…

【leetcode经典简单题】自食用||删除链表中倒数第k个结点

step by step. 题目&#xff1a; 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&a…

C# Blazor 学习笔记(8):row/col布局开发

文章目录 前言相关文章代码row和col组件B_rowB_col结构 使用 前言 可能是我用的element ui和 uView这种第三方组件用的太多了。我上来就希望能使用这些组件。但是目前Blazor目前的生态其实并不完善&#xff0c;所以很多组件要我们自己写。 我们对组件的要求是 我们在组件化一共…