5. ARM_指令集

概述

分类

汇编中的符号:

  • 指令:能够编译生成一条32位机器码,并且能被处理器识别和执行
  • 伪指令:本身不是指令,编译器可以将其替换成若干条指令
  • 伪操作:不会生成指令,只是在编译阶段告诉编译器怎么编译

ARM指令集的分类:

  • 数据处理指令:进行数学运算、逻辑运算
  • 跳转指令:实现程序的跳转,本质就是修改了PC寄存器
  • Load/Store指令:访问(读写)内存
  • 状态寄存器传送指令:用于访问(读写)CPSR寄存器
  • 软中断指令:触发软中断
  • 协处理器指令:操作协处理器的指令

指令格式:

汇编语言不区分大小写,但是不要出现一个指令里面既有大写也有小写。比如:可以写MOV或mov,但不要写成Mov 

立即数

什么是立即数:

立即数就是能够写在指令后面的数,例如 " MOV R0 #1 " 这个#1当中的数就是立即数。

立即数的本质就是包含在指令当中的数,属于指令的一部分。

注意:立即数不能写到32位,因为汇编指令转为机器码后是32位,这32位中有几位用来表示指令含义和寄存器含义,因此数据位并没有32位。

立即数与变量的区别:

立即数是指令的一部分,在使用立即数赋值时,CPU直接从机器码中就可以获取数据,不需要从内存中读取相应的值。

变量是存放在内存中,通过变量赋值,CPU必须先从内存中取出,再进行赋值。

32位非立即数却可赋值的情况:

当我们使用MOV R0, #0xFFFFFFFF这个指令时,0xFFFFFFFF是一个32位的数,一定不是一个立即数,但最终编译未出错。具体的编译器处理结果如下:

在这里,编译器将MOV R0, #0xFFFFFFFF 替换成了 MVN R0,#00000000,这个MVN的指令就是CPU可以识别执行的指令,原先的MOV就被称作伪指令。

条件码

条件码就是一个条件,当条件满足时执行这个操作,条件不满足时不执行该操作。

大多数的指令后都可以添加条件,具体示例见"跳转指令" - "2、B"

在使用条件码时,需要先使用CMP进行比较,之后再使用条件码进行条件执行。

条件码如下:

数据处理指令

1、数据搬移指令

1.1 MOV

将指定的数据搬移(赋值)到指定的寄存器中。

格式:

MOV 目标寄存器, 源操作数

目标寄存器: 可以为通用寄存器R0~R12,也可以是PC

源操作数:可以是立即数,也可以是寄存器

示例:

将立即数3搬移到寄存器R1,即:令R1=3

MOV R1, #3     @ #3代表十进制的3,#0x3代表十六进制的3

将R2寄存器的值搬移到寄存器R1,即:令R1=R2

MOV R1, R2

1.2 MVN

将指定的数据按位取反后,搬移(赋值)到指定的寄存器中。

格式: 

MVN 目标寄存器, 源操作数

示例:

将立即数0xFF取反后的值搬移到寄存器R1,即:令R1 = ~0xFF。

注意:这时R1存放的值为0xFFFFFF00,而不是0,因为ARM的寄存器是32位,所以在ARM寄存器中0xFF的存放值是0x000000FF,因此按位取反后为0xFFFFFF00,而不是0。

MVN R1 #0xFF

2、数值运算指令

一般格式:<操作码> <目标寄存器> <第一操作寄存器> <第二操作数>

  • 操作码:执行什么操作,如加减乘除
  • 目标寄存器:用于存放运算结果
  • 第一操作寄存器:必须是一个寄存器,是参与运算的数。
  • 第二操作数:可以是寄存器,也可以是立即数,这也是参与运算的数。

2.1 ADD

加法指令,将指定的两个数进行相加,结果存入指定的寄存器。

格式:

ADD 目标寄存器, 源寄存器, 源操作数

目标寄存器: 可以为通用寄存器R0~R12,也可以是PC

源寄存器:只能是寄存器

源操作数:可以是立即数,也可以是寄存器

示例:

已知R2=5,R3=3,实现R1=R2+R3

MOV R2,#5
MOV R3,#3
ADD R1,R2,R3 @ R1 = R2 + R3

已知R2=5,实现R1=R2+5

MOV R2,#5
ADD R1,R2,#5 @ R1 = R2 + 5
注意:这里不能写成ADD R1,#5,R2 对应ADD只有最后一个为源操作数

2.2 ADC

带进位的加法指令,将指定的两个数进行相加,并且会加上CPSR的进位。 

ADC实现64位运算:

实现:

0x00000001 00000002 + 0x00000003 00000004

思路:

将第一个数的低位和高位分别存放在R1、R2;将第二个数的低位和高位分别存放在R3、R4;将结果的低位和高位分别存放在R5、R6

运算代码:

MOV R1,0x00000002
MOV R2,0x00000001
MOV R3,0x00000004
MOV R4,0x00000003ADDS R5,R1,R3 @将两个低位相加并允许设置CPSR
ADC R6,R2,R4  @将两个高位相加并加上CPSR的C位(溢出进位)

ADCS实现128位运算:

实现:

0x00000001 00000002 00000003 00000004 + 0x00000005 00000006 00000007 00000008

运算代码:

MOV R1,0x00000004
MOV R2,0x00000003
MOV R3,0x00000002
MOV R4,0x00000001MOV R5,0x00000008
MOV R6,0x00000007
MOV R7,0x00000006
MOV R8,0x00000005ADDS R9,R1,R5     @将两个低位相加并允许设置CPSR
ADCS R10,R2,R6    @将两个高位相加并加上CPSR的C位(溢出进位)并允许设置CPSR
ADCS R11,R3,R7    @将两个高位相加并加上CPSR的C位(溢出进位)并允许设置CPSR
ADC  R12,R4,R8    @将两个高位相加并加上CPSR的C位(溢出进位)

2.3 SUB

减法指令,将指定的两个数进行相减,结果存入指定的寄存器。

该指令只能实现 "寄存器 - 寄存器" 或者 "寄存器 - 立即数" 但实现不了 "立即数 - 寄存器"

格式:

SUB 目标寄存器, 源寄存器, 源操作数

目标寄存器: 可以为通用寄存器R0~R12,也可以是PC

源寄存器:只能是寄存器

源操作数:可以是立即数,也可以是寄存器

注意:SUB减法中有顺序,源寄存器存放的是被减数,源操作数存放的是减数。

示例:

已知R2=5,R3=3,实现R1=R2-R3

MOV R2,#5
MOV R3,#3
SUB R1,R2,R3 @ R1 = R2 - R3

已知R2=5,实现R1=R2-5

MOV R2,#5
SUB R1,R2,#5 @ R1 = R2 - 5
注意:这里不能写成SUB R1,#5,R2 对应SUB只有最后一个为源操作数

2.4 SBC

带借位的减法指令,将指定的两个数进行相减,并且会减去CPSR的借位(C位取反)。

SBC实现64位运算:

实现:

0x00000002 00000001 - 0x00000001 00000002

运算代码:

MOV R1,0x00000001
MOV R2,0x00000002
MOV R3,0x00000002
MOV R4,0x00000001SUBS R5,R1,R4 @将两个低位相减并允许设置CPSR
SBC R6,R2,R5  @将两个高位相减并减去CPSR的C位取反(借位)

2.5 RSB

逆向减法指令,将指定的两个数进行相减,结果存入指定的寄存器。

该指令通过被减数与减数调换,解决了SUB不能实现"立即数 - 寄存器"的问题。

格式:

RSB 目标寄存器, 源寄存器, 源操作数

目标寄存器: 可以为通用寄存器R0~R12,也可以是PC

源寄存器:只能是寄存器

源操作数:可以是立即数,也可以是寄存器

注意:RSB减法中有顺序,源寄存器存放的是减数,源操作数存放的是被减数。这与SUB相反。

示例:

实现R1 = 3 - R2。

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

2.6 MUL

乘法指令,将指定的两个数进行相乘,结果存入指定的寄存器。

格式:

MUL 目标寄存器, 源寄存器, 源寄存器

目标寄存器: 可以为通用寄存器R0~R12,也可以是PC

源寄存器:只能是寄存器

注意:乘法指令中只能是两个寄存器相乘,不能使用立即数。

示例:

实现R1 = R2 * R3。

MUL R1,R2,R3     @ R1 = R2 * R3

3、位运算指令

3.1 AND

按位与指令,将指定的两个数进行按位与,结果存入指定的寄存器。

格式:

AND 目标寄存器, 源寄存器, 源操作数

目标寄存器: 可以为通用寄存器R0~R12,也可以是PC

源寄存器:只能是寄存器

源操作数:可以是立即数,也可以是寄存器

示例:

实现R1 = R2 & R3。

AND R1,R2,R3     @R1 = R2 & R3

3.2 ORR

按位或指令,将指定的两个数进行按位或,结果存入指定的寄存器。

格式:

ORR 目标寄存器, 源寄存器, 源操作数

目标寄存器: 可以为通用寄存器R0~R12,也可以是PC

源寄存器:只能是寄存器

源操作数:可以是立即数,也可以是寄存器

示例:

实现R1 = R2 | R3。

ORR R1,R2,R3     @R1 = R2 | R3

3.3 EOR

按位异或指令,将指定的两个数进行按位异或,结果存入指定的寄存器。

格式:

EOR 目标寄存器, 源寄存器, 源操作数

目标寄存器: 可以为通用寄存器R0~R12,也可以是PC

源寄存器:只能是寄存器

源操作数:可以是立即数,也可以是寄存器

示例:

实现R1 = R2 ^ R3。

EOR R1,R2,R3     @R1 = R2 ^ R3

3.4 LSL

左移指令,将指定的数左移指定的位,结果存入指定的寄存器。

格式:

LSL 目标寄存器, 源寄存器, 源操作数

目标寄存器: 可以为通用寄存器R0~R12,也可以是PC

源寄存器:只能是寄存器

源操作数:可以是立即数,也可以是寄存器

示例:

实现R1 = R2 << 3

方式1:寄存器法
MOV R3,#3
LSL R1,R2,R3 @R1 = R2 << 3方式2:立即数法
LSL R1,R2,#3 @R1 = R2 << 3

 3.4 LSR

右移指令,将指定的数右移指定的位,结果存入指定的寄存器。

格式:

LSR 目标寄存器, 源寄存器, 源操作数

目标寄存器: 可以为通用寄存器R0~R12,也可以是PC

源寄存器:只能是寄存器

源操作数:可以是立即数,也可以是寄存器

示例:

实现R1 = R2 >> 3

方式1:寄存器法
MOV R3,#3
LSR R1,R2,R3 @R1 = R2 >> 3方式2:立即数法
LSR R1,R2,#3 @R1 = R2 >> 3

3.5 BIC

位清零指令,将指定的位进行清零,结果存入指定的寄存器。

格式:

BIC 目标寄存器, 源寄存器, 源操作数

目标寄存器: 可以为通用寄存器R0~R12,也可以是PC

源寄存器:只能是寄存器

源操作数:可以是立即数,也可以是寄存器

注意:清零源操作数为1的位数,为0的位数不进行操作。但源寄存器的数值不进行改变

示例:

已知R2=0xFF,实现将R2低四位清零,并把结果写入到R1中,并且R2值不进行改变。

MOV R2,#0xFF
BIC R1,R2,#0x0F @0x0F的低四位为1,所以R2的低4位被清零,结果存入到R1@运算之后R1=0xF0,R2=0xFF(值不改变)

4、其他

4.1 格式扩展

格式扩展示例:

MOV R3, R0, LSL #3 ; 将R0的值左移3位后存入R3

格式扩展指令的看法:

首先这里面有MOV、LSR这两个指令,最前面的MOV是操作码,所以这个整体指令的功能是数据搬移功能,因此R0为第一操作数,LSL #3为第二操作数。

这里的LSL #3并不是一个指令,含义是左移3,操作的数据源就是前面的R0,返回的结果存放在前面的R3。因此最终功能是将R0的值左移3位后存入R3。

4.2 运算影响CPSR

指令后加S影响CPSR:

默认情况下,数据运算不会对CPSR的条件位产生影响。当指令加上后缀 "S" 后,即可影响CPSR

MOV R1,#3
SUB R2,R1,#5   @这计算是一个负数,但没有加S后缀,所以CPSR的N位不置1MOV R1,#3
SUBS R2,R1,#5  @这计算是一个负数,加了S后缀,所以CPSR的N位置1

跳转指令

1、CMP指令

比较指令,比较两个寄存器值中的关系,比较的结果存储再CPSR的NZCV中。

CMP的本质就是一条减法指令(SUBS),只是没有将运算结果存入寄存器。

格式:

CMP 源寄存器1 源寄存器2

当源寄存器1 == 源寄存器2时,CPSR中的 Z = 1。

当源寄存器1 != 源寄存器2时,CPSR中的 Z = 0。

当源寄存器1 < 源寄存器2时,CPSR中的 C = 0。

当源寄存器1 <= 源寄存器2时,CPSR中的 C = 0 或者 Z = 1。

当源寄存器1 > 源寄存器2时,CPSR中的 C = 1 且 Z = 0(相等时也不产生借位)。

当源寄存器1 >= 源寄存器2时,CPSR中的 C = 1。

2、B

跳转到指定的位置。跳转指令的本质就是修改PC指向。

注意:默认情况下LR不会自动保存下一条指令的地址,加上后缀 "L" 可以允许LR保存下一条指令的地址。

B称为不带返回的跳转指令,BL称为带返回的跳转指令。

格式:

B 条件码 标签

条件码可以不写,当不写时为无条件跳转,当写时为有条件跳转。 条件码如下:

示例:

1、无返回跳转到FUNC标号下的第一条指令位置。

当执行 " B FUNC " 之后,PC将指向 "MOV R6,#6" 并在下一次执行该指令。

2、有返回跳转到FUNC标号下的第一条指令位置,执行之后再返回。

当执行 " BL FUNC " 之后,PC将指向 "MOV R6,#6" 并且 LR存储了 "MOV R4,#4"的位置。

当执行 " MOV PC,LR "之后,PC将指向 "MOV R4,#4" 实现了返回。

 3、条件跳转,当R1=R2时,跳转到FUNC

当指向 "BEQ FUNC" 后,因为R1==R2不成立,所以不跳转,继续执行 "MOV R3,#3" 指令

Load/Store指令

1、STR

将指定寄存器中的数据存储到指定的内存地址中。

指令与存放数据的字节数:

  • STR   -- 4字节
  • STRH -- 2字节
  • STRB -- 1字节

格式:

STR 源寄存器 [目标寄存器]

目标寄存器中存放内存的地址

注意:源寄存器中数据为多少字节,那么目标寄存器存放的地址就得为多少的整数倍。

示例:

将R1的数据写入到R2存放的地址的位置。

这里R2存放的0x40000000为内存,这是因为地址映射时规定了这个地址是内存的起始地址。

这里R1的数据为0xFF000000是4字节,因此R2存放的地址应该为4的整数倍,所以如果R2的值为0x40000001,这就是错误的地址。

2、LDR

将指定的内存地址中的数据读取到指定寄存器中。

指令与取出数据的字节数:

  • LDR   -- 4字节
  • LDRH -- 2字节
  • LDRB -- 1字节

 格式:

LDR 目标寄存器 [源寄存器]

源寄存器存放的是所需取数据的数据地址。

示例:

将R2中存放的地址的数据读出来,存放到R3当中。 

该代码运行结束后,R3就存放了0xFF000000

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

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

相关文章

游戏行业使用高防独立IP有什么好处?

独立的IP就是您的虚拟主机自己有一个单独的IP地址&#xff0c;这样&#xff0c;您的用户除了记住您的域名外&#xff0c;在浏览器的地址栏敲入您的IP地址也能访问到您的网站。如果没有独立IP的话&#xff0c;别人要访问您的网站只能敲入域名才行。 而高防ip是指高防机房所提供的…

Android ANR分析总结

1、ANR介绍 ANR&#xff08;Application Not Responding&#xff09;指的是应用程序无响应&#xff0c;当Android应用程序在主线程上执行长时间运行的操作或阻塞I/O操作时发生。这可能导致应用程序界面冻结或无法响应用户输入。 1、Service ANR&#xff1a;前台20s&#xff0…

【comfyui教程】comfyui攻略:故障报错应对指南!

前言 ComfyUI的常见故障和解决&#xff0c;赶紧收藏起来&#xff0c; 在探索ComfyUI的曲折旅途中&#xff0c;最让人心生畏惧的莫过于那漫天的红色方框和层出不穷的报错信息。它们如同不息的风暴&#xff0c;一波未平&#xff0c;一波又起&#xff0c;令无数热忱的初学者在这…

[论文精读]SeqMIA: Sequential-Metric Based Membership Inference Attack

图像领域成员推理攻击 SeqMIA: Sequential-Metric Based Membership Inference Attack http://arxiv.org/abs/2407.15098 ACM CCS 2024 先看overview&#xff0c;猜测文章的方法&#xff1a;训练影子模型&#xff0c;使用影子模型、蒸馏数据集和目标模型共同参与蒸馏任务&am…

机器学习基础02

目录 1.特征工程 1.1特征工程概念 1.2特征工程的步骤 1.3特征工程-特征提取 1.3.1字典特征提取 1.3.2文本特征提取 英文文本提取 中文文本提取 1.3.3TF-IDF文本特征词的稀有程度特征提取 2.无量纲化 2.1归一化 2.2标准化 2.3fit、fit_transform、transform 3.特征…

watermark大模型水印详解

一 watermark定义 模型水印是一种用于模型版权保护的技术&#xff0c;通过向大模型植入水印&#xff08;触发集数据加上特定的噪声或者标志&#xff09;&#xff0c;使得模型学习到这种特定的噪声或者标志的特征&#xff0c;通过特定的问题可以从大模型的回答中提取出水印进行…

做运维工程师辛苦吗?

你要知道做那一块的运维 网络运维&#xff08;确保网络稳定安全&#xff09; 应用运维&#xff08;应用软件进程监控、服务和端口相应情况、故障处理等&#xff09; 系统运维&#xff08;操作系统监控 恢复 等&#xff09;、 桌面和外围设备运维&#xff08;计算机终端、外…

关于报错‘cross-env‘ 不是内部或外部命令,也不是可运行的程序

在使用ANT DESIGN PRO这个react框架时出现了cross-env 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 如图&#xff1a; 解决办法&#xff1a; 需要全局安装 cross-dev npm install -g cross-env -save-dev 然后重新启动npm start 注意&#xff1a;…

智能座舱多屏项目,中控屏切换语言,后排屏闪黑屏问题

1. 背景 智能座舱多屏项目&#xff0c;中控屏切换语言&#xff0c;后排屏闪黑屏问题 2. 详细分析过程 通过events log查看activity的生命周期&#xff1a;adb shell logcat -b events com.android.rwhvac.view.behind.BehindActivity2 : displayId 2 副屏app com.android.…

基于Multisim温度计温度测量检测测量系统电路(含仿真和报告)

【全套资料.zip】温度计温度测量检测测量系统电路Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 温度检测测量系统 1.温度测量范围为0&#xff5e;200&#xff23;&#xff1b; 2.三位数…

浅层神经网络

浅层神经网络 浅层神经网络通常指包含一个隐藏层的神经网络。这个网络由输入层、隐藏层和输出层构成&#xff1a; 输入层&#xff1a;输入层负责接收网络的输入特征&#xff0c;通常表示为列向量 x T [ x 1 , x 2 , x 3 ] x^T [x_1, x_2, x_3] xT[x1​,x2​,x3​]&#xff…

解决apidoc不是内部或外部命令,也不是可运行的程序 或批处理文件。

apidoc官网 首先确保安装了apidoc,我这里是全局安装的。 npm install apidoc -g然后打开cmd窗口执行命令时就会报错。 apidoc 不是内部或外部命令,也不是可运行的程序 或批处理文件。 此时只需要找到它&#xff0c;再把它加入环境变量即可了。 win10中npm默认路径:C:\User…

可私有化部署API的集装箱箱号自动识别技术,专业算法厂家

启智畅想作为人工智能行业OCR识别算法厂家&#xff0c;可将集装箱箱号自动识别技术私有化部署&#xff0c;并提供私有化部署的API的接口&#xff0c;在物流行业中正逐渐崭露头角&#xff0c;成为提升效率与精度的关键力量。这一技术不仅打破了传统识别方式的局限&#xff0c;更…

【快速解决】kafka崩了,重启之后,想继续消费,怎么做?

目录 一、怎么寻找我们关心的主题在崩溃之前消费到了哪里&#xff1f; 1、一个问题&#xff1a; 2、查看消费者消费主题__consumer_offsets 3、一个重要前提&#xff1a;消费时要提交offset 二、指定 Offset 消费 假如遇到kafka崩了&#xff0c;你重启kafka之后&#xff0…

第七届中国国际进口博览会 2024长三角G60科创走廊高质量发展要素对接大会举行

11月9日&#xff0c;第七届中国国际进口博览会2024长三角G60科创走廊高质量发展要素对接大会在国家会展中心举行。会上&#xff0c;G60科创走廊九城市共赴进博之约&#xff0c;以全面深化改革为动力&#xff0c;深入推进长三角G60科创走廊走深走实&#xff0c;携手推动科技创新…

一键P图新神器!SeedEdit让图片编辑更快捷!

大家还记得MJ推出的图片编辑功能吗&#xff1f;只需涂抹想要修改的区域&#xff0c;再输入提示词&#xff0c;就能一键更改原图。而现在&#xff0c;豆包大模型团队也推出了类似的功能——SeedEdit&#xff0c;而且更加简单快捷&#xff01; Ai 智能办公利器 - Ai-321.com 人工…

【数据分析与数据挖掘】决策树算法

决策树的构造的本质是利用训练数据构造一棵决策树&#xff0c;然后利用这棵树所提炼出来的规则进行预测。算法过程大体分为两步&#xff1a;1.利用训练数据构造决策树 2.利用构造的决策树进行预测 分类相关知识 信息熵 信息熵由香农提出&#xff0c;用来衡量事件的不确定性的…

丹摩征文活动|智谱AI引领是实现文本可视化 - CogVideoX-2b 部署与使用

文章目录 前言一、DAMODEL平台特性二、创建CPU云实例三、CogVedioX介绍四、DAMODEL一键部署CogVideoX1. 创建丹摩实例(参考上述介绍)2. 配置环境和依赖3. 模拟与配置文件4. 开始运行4.1 调试4.2 webUI4.3 端口映射 前言 DAMODEL&#xff08;丹摩智算&#xff09;是一款专为满足…

22. 记录架构

文章目录 第22章 记录架构22.1 架构文档的用途和受众22.2 符号表示22.3 视图模块视图组件和连接器视图C&C 视图的符号表示 分配视图质量视图 22.4 组合视图22.5 记录行为22.6 视图之外22.7 记录基本原理22.8 架构的利益相关者22.9 实际考虑建模工具在线文档、超文本和维基遵…

Python练习19

Python日常练习 题目&#xff1a; 打印如下九九乘法表 1*11 2*12 2*24 3*13 3*26 3*39 4*14 4*28 4*312 4*416 5*15 5*210 5*315 5*420 5*525 6*16 6*212 6*318 6*424 6*530 6*636 7*17 7*214 7*321 7*428 7*535 7*642 7*749 8*18 8*216 8*324 8*432 8*540 8*648 8*756 8*86…