嵌入式系统复习--ARM指令集(二)

文章目录

  • 上一篇
  • ARM指令详细介绍
  • 数据处理指令
  • Load/Store指令
  • 转移指令
  • 异常中断指令
  • 协处理器指令
  • 下一篇

上一篇

嵌入式系统复习–ARM指令集(一)

ARM指令详细介绍

  1. 分类
    • 数据传送指令
    • 算术运算指令
    • 逻辑运算指令
    • 比较指令
    • 测试指令
    • 乘法指令
  2. 二进制编码格式
    在这里插入图片描述
    • #为1表示采用立即数的形式(8位立即数经过后4位*2的循环右移得到立即数)
    • #为0表示采用寄存器的形式但是原理和上面一样,只是将8位立即数,和循环移位的位数变成了用寄存器来存,如果4位为0表示将立即数经过(Sh)类型的移位寄存器位(Rm),如果4位为1表示将寄存器Rs经过(Sh)类型移位(Rm)位

第二操作数可以是立即数,也可是是寄存器
如果是立即数就必须要满足除0外的8位在连接首位的圆圈内是宽度不超过8的(紧挨在一起的)同时还要满足宽度不能是奇数,因为循环移动是是移动的偶数,所以当宽度是奇数时就对不齐了表示不了

在这里插入图片描述
移位操作只有两位,只能保留4种,ASR、LSL、LSR、ROR

数据处理指令

具体指令
在这里插入图片描述

  • ADD、SUB、RSB、ADC、SBC、RSC
    加、减、反减,不带进位和带进位
    条件码标志,如果带上S则根据结果要更新NZCV


    R15的使用:
    若将R15作为Rn(第一操作数寄存器)使用则它的值是指令的地址加上对应偏移量(三级流水线加8)相当于读程序计数器的值
    若使用R15作为Rd(目的寄存器),相当于要改写,这是不允许的所以有对应特殊的用法则:

    • 执行转移到结果对应的地址立即跳转
    • 若加上后缀S,则将当前的SPSR拷贝到CPSR。可以使用这一点从异常返回(在用户模式或系统模式时R15作为Rd时,不用后缀S)异常返回,只有发生异常时才能使用
    • 在有寄存器控制移位的任何数据处理指令中,不能将R15作为Rd或任何操作数来使用禁止修改

在这里插入图片描述

  • AND、ORR、EOR、BIC
    逻辑与、或、异或、位清零
    条件码标记:
    若指定S,则根据结果更新标志N、Z,在计算第二操作数时更新C,不影响标志V

  • MOV和MVN(传送和取反)
    条件码标志:
    同上一个影响相同

  • CMP和CMN(比较和比较反值)
    用法:将寄存器的值与第二操作数进行比较。他们根据结果更新条件标志位,但结果不放到任何寄存器中
    CMP:根据Rn - Op2设置条件码,结果丢弃
    CMN:根据Rn + Op2设置条件码,结果丢弃

    条件码:根据结果NZCV都可能改变

  • TST和TEQ(测试和测试相等)
    句法:

    TST {cond} Rn, Operand2
    TEQ {cond} Rn, Operand2
    

    用法:
    TST:对Rn的值和Operand2的值进行按位与操作,设置条件码,丢弃结果
    TEQ:对Rn的值和Operand2的值进行按位异或操作,设置条件码,丢弃结果

  • 乘法指令
    在这里插入图片描述
    可以看出Rd, Rn都可以作为目的寄存器,但是Rn也作需要加时存放的,为了能表示32位和64位,当表示32位是只使用Rd,但是要表示64位是就需要同时使用Rd和Rn了,此时Rd作为高位,Rn作为低位。

  • MUL和MLA(乘法和乘加)
    句法:

    MUL {cond} {S} Rd, Rm, Rs
    MLA {cond} {S} Rd, Rm, Rs, Rn
    

    R15不能用作Rd、Rm、Rs、Rn。
    Rn不能与Rm相同
    条件标志码:根据结果更新N和Z,不影响V,C不用看

  • UMULL、UMLAL、SMULL、SMLAL
    无符号和带符号长乘数乘法和乘加,结果为64位
    句法:

    Op {cond} {S} RdLo, RdHi, Rm, Rs
    

    也可以使用半字进行运算
    在这里插入图片描述
    在这里插入图片描述
    保持原来的32位<x,y>中填W

Load/Store指令

ARM的数据存储指令Load/Store是唯一用于寄存器和存储器之间进行数据传送的指令。

分类:

  • 单寄存器的存取指令(LDR, STR)

  • 多寄存器存取指令(LDM, STM)

  • 单寄存器交换指令(SWP)

  • 单寄存器的存取指令

根据传送数据类型的不同可以分为:

  • 单字和无符号字节的数据传送指令

    汇编格式:

    • 前变址格式
    LDR|STR {<cond>} {B} Rd, [Rn, <offset>]{!}
    
    • 后变址格式
    LDR|STR {<cond>} {B} {T} Rd, [Rn], <offset>
    
    • 相对PC的形式
    LDR|STR {cond} {B} Rd, LABEL
    

    T:是特权模式下使用,在用户模式下不可用。

  • 半字和有符号字节的数据传送指令

    汇编格式:

    • 前变址格式

      LDR|STR{<cond>} H|SH|SB Rd, [Rn, <offest>] {!}
      
    • 后变址格式

      LDR|STR {<cond>} H|SH|SB Rd, [Rn], <offest>
      

      可以是8位立即数或 寄存器
      其中
      SH:带符号的半字
      H:无符号的半字
      SB:带符号的字节

      半字传送的地址必须是偶数

  • LDR和STR双字
    加载两个相邻的寄存器和存储两个相邻的寄存器,64位双字
    句法:

    op {cond} D Rd, [Rn]
    op {cond} D Rd, [Rn, offset] {!}
    op {cond} D Rd, label
    op {cond} D Rd, [Rn], offset
    

    其中:Rd 加载或存储寄存器其中一个,另一个是R(d + 1)。Rd必须是偶数寄存器,且不是R14
    Rn 除非指令为零偏移,或不带回写的前索引,否则,Rn不允许与Rd和R(d + 1)相等

    例:
    LDRD R6, [R11]
    STRD R4, [R9, #24]
    STRD R0, [R9, R2]!
    
  • 多寄存器存取指令LDM/STM
    可以将16个寄存器(R0~R15)的任意集合存储到存储器或从存储器读到寄存器
    汇编格式:

    LDM/STM {<cond>} <add mode> Rn{!}, <REGISTERS>{^}
    

    在这里插入图片描述
    在这里插入图片描述

  • 单寄存器交换指令(SWP)
    汇编格式:

SWP {B} {<cond>} Rd, Rm, [Rn]

例句:

SWPB R1, R1, [R0] 交换字节,将[R0]中的字节数据读取到R1中,同时将R1中的数据写入到[R0]中
SWP R1, R2,[R3] 交换字节数据,将[R3]中的数据读取到R1中,同时将R2中的数据读入到[R3]中
  • 状态寄存器到通用寄存器的传送指令(MRS)
    汇编格式:
    MRS {<cond>} Rd, CPSR|SPSR
    
  • 通用寄存器到状态寄存器的传送指令(MSR)
    汇编格式
    MSR {<cond>} CPSR_f | SPSR_f, #<32-bit immediate>
    MSR {<cond>} CPSR_<field> | SPSR_<field>, Rm
    
    field表示:
    c 控制域屏蔽字节(PSR[7:0])
    x 扩展域屏蔽字节 (PSR[15:8])
    s 状态域屏蔽字节 (PSR[23:16])
    f 标志域屏蔽字节 (PSR[31:24])

转移指令

ARM的转移指令可以从当前指令向前或向后的32MB的地址空间跳转,根据完成的功能他可以分为:

  • 转移和转移链接指令(B, BL)
    BL指令会将转移后境界的一条指令的地址链接到寄存器LR(R14)
    汇编格式:
B {L} {<cond>} <target address>
  • 转移交换和转移链接交换(BX, BLX)
    这些指令用于支持Thumb(16位)指令集的ARM芯片,程序可以通过这些指令实现从ARM到Thumb状态的切换
    汇编格式:
    B {L} X {<cond>} Rm
    BLX  <target address>
    
    BX格式中:Rm的第0位拷贝到CPSR的T位,[31:1]位移入PC。若Rm[0] = 1, 切换到Thumb状态,Rm最低位清0,从Rm开始执行;若Rm[0] = 0将Rm[1]位清0,从Rm开始执行。
    BLX格式中:将指令有符号的24位偏移量用符号扩展到32位,然后左移2位形成偏移,然后加载到PC中,把H位加到目标地址的第1位,使得目标指令选择奇数的半字地址,执行Thumb指令

异常中断指令

异常中断可以分为两种

  • 软件中断指令(SWI)
    “监控调用”,他将处理器置于监控(SVC)模式
    汇编格式:
    SWI {<cond>} <24为立即数>
    
  • 断点指令(BKPT-仅用于v5T体系)
    它将处理器停止执行正常指令而进入相应的调试程序
    汇编格式:
    BKPT {immed_16}
    

软件中断指令SWI用于产生SWI异常中断,用来实现在用户模式下队操作系统中特权模式的程序的调用;断点中断指令BKPT主要用于产生软件中断,龚供调试程序用。

  • 前导零计数CLZ
    汇编格式:
    CLZ {<cond>} Rd, Rm
    
    说明:
    对Rd设置为Rm中为1的最高有效位的位置数。
    即对Rm中的前导0的个数进行计数,结果存放到Rd中
    若Rm = 0, 则Rd = 32
    若Rm[31] = 1, 则Rd = 0
    举例:
    MOV R11, #0x35E20 //LDR伪指令
    CLZ R5, R11 // R5 = 14
    

协处理器指令

ARM支持16个协处理器,用于各种协处理器操作

  • 协处理器的数据操作
    协处理器数据操作完全是协处理器内部的操作,它完成协处理器寄存器的状态改变
    汇编格式:
    CDP {<cond>} <CP#>, <Cop1>, CRd, CRn, CRm{, <Cop2>}
    
    CP#: 协处理器名,标准名为pn, n为0~15范围内的整数
  • 协处理器的数据存取
    从存储器读取数据装入协处理器寄存器,或将协处理器寄存器中的值存入存储器
    汇编格式:
    • 前变址格式
    LDC|STC {<cond>} {L} <CP#>, CRd, [Rn <offset>] {!}
    
    • 后变址格式
    LDC|STC{<cond>} {L} <CP#>, CRd, [Rn], <offset>
    
  • 协处理器的寄存器传送
    汇编格式:
    • 从协处理器传送到ARM寄存器
    MRC {<cond>} <CP#>, <Cop1>, Rd, CRn, CRm {, <Cop2>}
    
    • 从ARM寄存器传送到协处理器
    MCR {<cond>} <CP#>, <Cop1>, Rd, CRn, CRm {, <Cop2>}
    

下一篇

未完待续

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

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

相关文章

Ubuntu 22.04 禁用(彻底移除)Snap

什么是Snaps Snaps 是 Ubuntu 的母公司 Canonical 于 2016 年 4 月发布 Ubuntu 16.04 LTS&#xff08;Long Term Support&#xff0c;长期支持版&#xff09;时引入的一种容器化的软件包格式。自 Ubuntu 16.04 LTS 起&#xff0c;Ubuntu 操作系统可以同时支持 Snap 及 Debian …

Python之Django项目的功能配置

1.创建Django项目 进入项目管理目录&#xff0c;比如&#xff1a;D盘 执行命令&#xff1a;diango-admin startproject demo1 创建项目 如果提示diango命令不存在&#xff0c;搜索diango-admin程序的位置&#xff0c;然后加入到环境变量path中。 进入项目&#xff0c;cd demo…

了解XSS、CSRF攻击这一篇就够了

目录 XSS攻击XSS概念XSS案例XSS攻击类型反射型存储型 总结 CSRFCSRF概念CSRF防御方式一&#xff1a;跨域禁止携带cookie方式二&#xff1a;设置SameSite属性为Strict方式三&#xff1a;验证Referer字段&#xff08;利用浏览器功能&#xff09;方式四&#xff1a;Token XSS攻击 …

深入理解 JavaScript 函数:提升编程技能的必备知识(中)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

WPF组合控件TreeView+DataGrid之DataGrid封装

&#xff08;关注博主后&#xff0c;在“粉丝专栏”&#xff0c;可免费阅读此文&#xff09; wpf的功能非常强大&#xff0c;很多控件都是原生的&#xff0c;但是要使用TreeViewDataGrid的组合&#xff0c;就需要我们自己去封装实现。 我们需要的效果如图所示&#x…

【MAC、IOS】charles抓包配置教程,亲测有效

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

4.3【共享源】克隆实战开发之截屏(一)

一,Screen截屏介绍 Screen的截屏是指从源读取像素,然后复制到缓冲区。然后可以根据需要操纵缓冲区;它可以简单地写入文件,也可以在其他窗口或显示器中使用。 Screen API从源中读取像素,并将其复制到提供的缓冲区中以捕获截屏。缓冲区可以是pixmap或窗口缓冲区,但必须设…

UE5 Landscape 制作GIS卫星图地形

1. 总体想法&#xff1a; 制作GIS地形&#xff0c;使用Landscaping MapBox是一个好方法&#xff0c;但是区域过大&#xff0c;会占用很多内存 https://blog.csdn.net/qq_17523181/article/details/135029614 如果采用QGis&#xff0c;导出卫星图&#xff0c;在UE5里拼合出地形…

趁网站还在!用python把次元岛COS小姐姐图集批量下载~

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 开发环境: Python 3.10 Pycharm 模块使用: requests >>> 数据请求模块 re >>> 匹配提取数据 os >>> 自动创建文件夹 如何安装python第三方模块: win R 输入 cmd 点击确定, 输入安装命令 p…

Codeforces Round 862 (Div. 2)

Problem - A - Codeforces AC代码: #include<bits/stdc.h> #define endl \n //#define int long long using namespace std; const int N1e310; int a[N]; int n; void solve() {cin>>n;int ans0;for(int i1;i<n;i) cin>>a[i],ans^a[i];if(n%21){for(in…

SQL布尔盲注 (Blind)基本原理及使用burpsuite进行暴力猜解

SQL布尔型盲注入是一种SQL注入攻击方式&#xff0c; 根据某个条件是否成立&#xff0c;来判断返回结果的真假&#xff0c;通过布尔型盲注&#xff0c;攻击者可以逐个字符地推断出数据库中存储的信息&#xff0c;如用户名、密码等&#xff0c;从而获取敏感信息或者执行非法操作。…

【EI会议征稿】第三届算法、微芯片与网络应用国际会议(AMNA 2024)

第三届算法、微芯片与网络应用国际会议&#xff08;AMNA 2024&#xff09; 2024 3rd International Conference on Algorithms, Microchips and Network Applications 第三届算法、微芯片与网络应用国际会议(AMNA 2024) 将于2024年3月8-10日在中国西安召开, AMNA 2024将围绕 …

表格实现合并单元格

实现的效果 一、列合并 此需求的列合并比较简单, 直接使用el-table-column包括即可 <el-table-column align"center" sortable label"目标"><el-table-column prop"target1" sortable label"预设目标" /><el-table-c…

设计模式-门面模式

设计模式专栏 模式介绍模式特点应用场景门面模式和代理模式的区别代码示例Java实现门面模式Python实现门面模式 门面模式在spring中的应用 模式介绍 门面模式是一种常用的软件设计模式&#xff0c;也称为外观模式。它提供了一个高层次的接口&#xff0c;将一个子系统的外部与内…

1. 行为模式 - 责任链模式

亦称&#xff1a; 职责链模式、命令链、CoR、Chain of Command、Chain of Responsibility 意图 责任链模式是一种行为设计模式&#xff0c; 允许你将请求沿着处理者链进行发送。 收到请求后&#xff0c; 每个处理者均可对请求进行处理&#xff0c; 或将其传递给链上的下个处理…

SaaS智慧校园云平台源码,智慧班牌系统,家校互联小程序源码

SaaS智慧校园云平台源码&#xff0c;智慧班牌系统&#xff0c;原生小程序 集智慧教学、智慧教务、智慧校务、智慧办公于一体的校园管理平台源码。集成智能硬件及第三方服务&#xff0c;面向学校、教师、家长、学生&#xff0c;将校内外管理、教学等信息资源进行整合&#xff0c…

vue微乾坤子应用开发及ele组件开发时问题记录

一. 微乾坤 1. 新增page页面路由,pmi权限中心配置正常&#xff0c;跳转链接正确&#xff0c;但路由未找到403. 解决&#xff1a; 新增的配置是page类型&#xff0c;transformQianKunRoute方法转换微前端路由数据 时&#xff0c;过滤未兼容page型的路由&#xff0c; 解决 [menu,…

Android开发——添加图片

1、首先选择一张需要的图片&#xff0c;通过左侧的Resource Manage选择“”并选择Import Drawables 选择一张图片 并调整以下两个内容 这两个内容的作用借用谷歌官方的Android开发教程的内容&#xff1a; *Android 设备具有不同的屏幕尺寸&#xff08;手机、平板电脑和电视等…

Histcite下载教程

这个安装就很简单了&#xff0c;可以通过百度网盘下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1WVkXnh3LiJJ08nKqmI5LQw?pwdug9c 提取码&#xff1a;ug9c 解压后&#xff0c;将savedress_for_test.txt放入TXT文件当中 双击main.exe文件&#xff0c;输入1或2…

Kubectl 部署简单应用

创建新服务 kubectl create deployment kubernetes-bootcamp --imagegcr.io/google-samples/kubernetes-bootcamp:v1查看 kubectl get deployments打开新的终端执行 kubectl proxy此时&#xff0c;切回上一个终端&#xff0c;通过 kubectl get pods可查看已部署好的pod。并通…