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

文章目录

  • 上一篇
  • ARM指令集概述
  • ARM寻址方式
  • 下一篇

上一篇

嵌入式系统复习–ARM技术概述

ARM指令集概述

ARM指令集是32位的,程序的启动都是从ARM指令集开始。
指令编码 = 第一操作数 + 第二操作数 + 目的操作数 + 条件影响标志位 + 不同功能实现的二进制位 指令编码 = 第一操作数 + 第二操作数 + 目的操作数 + 条件影响标志位 + 不同功能实现的二进制位 指令编码=第一操作数+第二操作数+目的操作数+条件影响标志位+不同功能实现的二进制位
在这里插入图片描述

  • 根据CPSR中的条件位自动判断是否执行指令
  • 最高的四位[31 : 28]是用来表示条件码(cond)的
    在这里插入图片描述
  • N为符号位,1负0正
  • Z为结果为0位,1表示为0, 0表示不是
  • C是进位位,加法进位位1,减法进位为0
  • V是有符号溢出,溢出为1

重要的基本条件
在这里插入图片描述
ARM指令使用的基本格式:
在这里插入图片描述

  • opcode操作码(指令助记符)如LDR、STR等
  • cond可选条件码(上面的基本条件);也称为执行条件
  • S表示是否修改标志位(加上会修改标志位CPSR)
  • Rd目标寄存器
  • Rn存放第一操作数的寄存器
  • operand2 第2操作数

举例:

LDR R0, [R1] //读取R1地址上的存储器单元内容,加上[]表示存储器

BEQ DATAEVEN //条件执行分支指令,执行条件为EQ,表示相等的时候跳转到DATAENEN(标号)

ADDS R2, R1, #1 //加法指令,R2 <- R1 + 1,加上了S影响CPSR寄存器

SUBNES R2, R1, #0x20 //减法指令,当不相等NE的时候R2 <- R1 - 0x20结果影响CPSR寄存器

ARM寻址方式

  1. 立即寻址
    操作数在指令里,可以立即获得操作数(也称立即数),以及数以#为前缀,加上“0x”的是十六进制数

    ADD R0, R0, #1 //R0 <- R0 + 1
    

    参与运算的是32位立即数,由于位数不够全部放入,因此这个#给出的是压缩后的立即数
    而这个存放方式是,采用8位的常数循环右移偶数位而间接得到,其中循环右移的位数由4位二进制的两倍表示,立即数记作,而8位常数记作immed_8, 4位的循环右移值记作rotate_imm
    < i m m e d i a t e > = i m m e d _ 8 循环右移( 2 ∗ r o t a t e _ i m m ) <immediate> = immed\_8循环右移(2*rotate\_imm) <immediate>=immed_8循环右移(2rotate_imm
    一个立即数中非0以外的宽度在8以内就能通过移位表示出成32位

  2. 寄存器寻址
    对应的数值在寄存器中

    ADD R0, R1, R2 //R0 <- R1 + R2
    

    同时也有特殊之处,如果第二操作数是寄存器,则可以选择是否对第二操作数进行移位如果选择可以从(逻辑左移LSL(无符号数), 逻辑右移LSR, 算术左移ASL(有符号数), 算术右移ASR, 右循环移位ROR, 右循环拓扑(其中标志位C也参与移位用)RRX)分别表示中选择移位方式,移位位数可以选择第4个寄存器,也可以是5位的立即数
    移位方法:
    逻辑移位左右移都是补0
    算术移位分为

    左移右移
    右侧补0左侧补0
    右侧补0左侧补1
    ADD R3, R2, R1, LSR #2 // R3 <- R2 + (R1 / 4)
    
  3. 寄存器间接寻址
    以寄存器的值作为操作数的地址,而操作数本身存放在存储器中。

    LDR R0, [R1] // R0 <- [R1]
    STR R0, [R1] // [R1] <- R0
    

    指向的是4个字节的地址,寻找对应操作数要根据对应大端小端存储来进行前后找

  4. 基址加偏址寻址
    将寄存器(基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。
    根据是先取指令还是先变址分为:

    • 前变址模式
    LDR RO, [R1, #4] // R0 <- [R1 + 4]
    
    • 自动变址模式
    LDR R0, [R1, #4]! // R0 <- [R1 + 4]、 R1 <- R1 + 4
    
    • 后变址模式
    LDR R0, [R1], #4 // R0 <- [R1]、R1 <- R1 + 4
    

    同时地址偏移量可以是立即数也可以寄存器,并且在加到基址寄存器前也可以进行移位操作。

    LDR r0, [r1, r2] // r0 <- [r1 + r2]
    LDR r0, [r1, r2, LSL #2] // r0 <- [r1 + r2*4]
    

    常用立即数的,寄存器形不常用

传输的数据类型,默认是选择字操作,但是可以通过增加后缀来进行字节(B)、半字(H)来进行操作

  1. 堆栈寻址

    • 当堆栈指针指向最后压入堆栈的数据时,称为满堆栈,而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈。
    • 当访问寄存器时,存储器的地址向高地址方向生长,称为递增堆栈。存储器地址向低地址方向生长,称为递减堆栈。决定堆栈指针是加1还是减1

    将上述两种类型组合可以组合成4种;

  2. 块拷贝寻址
    是多寄存器传送指令LDM/STM的寻址方式,他可以将存储器中的数据块加载到多个寄存器中,也可以把多个寄存器中的内容保存到存储器中,这多个寄存器可以是R0~R15这16个寄存器的子集或者所有寄存器,与堆栈的分类方式类似。
    在这里插入图片描述两种寻址方式的后缀;I:increase 、D:decrease、A:after、B:before、F:full、E:empty
    例:

    ARM指令:
    STMFD SP! {R1 - R7, LR} : 入栈
    LDMFD SP! {R1 - R7, LR}: 出栈
    
    Thumb指令:
    PUSH {R1 - R7, LR} : 入栈
    POP {R1 - R7, LR} :出栈
    
  3. 相对寻址方式
    它是以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。BL即为指令符号

    BL NEXT // 跳转到子程序,子程序调用
    ......  //到NEXT处执行,返回之后再从BL下一条指令开始执行
    NEXT
    ......
    MOV PC, LR //从子程序返回
    

下一篇

未完待续

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

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

相关文章

模型实战(17)之C++ - tensorRT部署yolov8seg实例分割

模型实战(17)之C++ - tensorRT部署yolov8seg实例分割 yolov8是2023年以来最新的集检测、分割、分类、关键点于一身的模型参考官网文档:添加链接描述本文将详细给出C++ - tensorRT部署yolov8seg模型的详细步骤实现效果的话,精度和python环境下差不多,仅推理时间在RTX30~系列…

怎么选,都得是python!

什么编程语言最好&#xff1f; python!python!python! 天下语言千千万&#xff0c;不行咱就换&#xff01; 但是&#xff0c;兜兜转转&#xff0c;到头来发现还得是你——python 最香! 有一说一&#xff0c;为了早日实现财富自由&#xff0c;开篇建议&#xff1a;专业人士还…

IspSrver-DNS

2023年全国网络系统管理赛项真题 模块B-Windows解析 题目 安装DNS服务器,根据题目创建必要正向区域和反向区域的DNS解析。把当前机器作为互联网根域服务器,创建test1.com~test100.com,并在所有正向区域中创建一条A记录,解析到本机地址。配置步骤 安装DNS服务器,根据题目创…

【Linux】Linux线程概念和线程控制

文章目录 一、Linux线程概念1.什么是线程2.线程的优缺点3.线程异常4.线程用途5.Linux进程VS线程 二、线程控制1.线程创建2.线程终止3.线程等待4.线程分离 一、Linux线程概念 1.什么是线程 线程是进程内的一个执行流。 我们知道&#xff0c;一个进程会有对应的PCB&#xff0c;…

大连海事大学博士学位论文在知网论文提交过程中遇到“去掉辅助和文摘中的多余信息“的解决方案

1. 问题描述 遇到的问题长这样。 辅助指的是中文摘要&#xff1b;文摘指的是英文摘要。 问题说明&#xff0c;每次保存完&#xff0c;都会出现两个多余的空行&#xff1b;你删除了&#xff0c;保存再打开&#xff0c;又出现了两个空行。 2 问题原因 2.1 粘贴摘要操作 如果…

Qt中多线程使用案列

Qt中多线程下载大文件 #pragma once#include <QWidget> #include <QPushButton> #include "ThreadPool.h" #include <QProgressBar> #include <QLabel> #include <QHBoxLayout> #include <QVBoxLayout> class MainWindow : pub…

nginx 离线安装 https反向代理

这里写自定义目录标题 安装步骤1.安装nginx所需依赖1.1 安装gcc和gcc-c1.1.1下载依赖包1.1.2 上传依赖包1.1.3安装依赖 1.2 安装pcre1.2.1 下载pcre1.2.2 上传解压安装包1.2.3 编译安装 1.3 下载安装zlib1.3.1 下载zlib1.3.2 上传解压安装包1.3.3 编译安装 1.4 下载安装openssl…

【K8s】3# 使用kuboard管理K8s集群(NFS存储安装)

文章目录 1.NFS是什么2.配置NFS服务器2.1.执行以下命令安装 nfs 服务器所需的软件包2.2.执行命令 vim /etc/exports&#xff0c;创建 exports 文件&#xff0c;文件内容如下2.3.执行以下命令&#xff0c;启动 nfs 服务2.4.检查配置是否生效 3.在客户端测试NFS3.1.执行以下命令安…

基于51的智能交通信号灯设计

文章目录 概要仿真图程序总结 资料下载地址&#xff1a;基于51的智能交通信号灯设计 概要 可实现东西、南北两个方向的红、黄、绿灯按设定的时间亮灭&#xff0c;用以指引交通通行&#xff0c;以倒计时方向显示时间。红、黄、绿交通灯的变化规律为&#xff1a; 1&#xff09…

在国内如何使用某知名GPT,附在线体验链接

在线体验 三种方式&#xff1a; 一、访问openai&#xff0c;之前需要国外手机号&#xff0c;现在好像不用验证了&#xff0c;但是调用API还是需要验证手机号 二、购买一个海外服务器&#xff0c;然后自行在海外服务器上部署一套调用OpenAI接口的服务 三、通过一些国内封装好的网…

Mybatis基本操作

目录 准备工作 删除操作 预编译SQL 增加操作 获取返回的主键 更新操作 准备工作 准备数据库表 emp创建一个新的springboot工程&#xff0c;选择引入对应的起步依赖&#xff08;mybatis、mysql驱动、lombok&#xff09;application.properties中引入数据库连接信息创建对应…

MDC Manifest Configurator

基于华为手册总结摘要的&#xff0c;有分布手册没写的&#xff0c;我给补充上了&#xff0c;比如&#xff1a;定义启动设定 CM配置流程&#xff1a;配置流程涵盖定义数据类型、服务接口、子网信息、部署通信、部署通信协议、定义可执行程序和进程、定义应用进程信息、创建服务…

c语言错误总结

函数 A:void类型函数可以 B&#xff1a;不需要&#xff0c;如果return 不返回任何值&#xff0c;函数会在return语句执行后终止执行&#xff0c;后面的语句不会执行 C&#xff1a;对的 D&#xff1a;不可能&#xff0c;return只能返回一个数据 A:函数不一定有返回值 B:可以…

JS - 设计模式持续学习中

通过例子持续学习JS设计模式中&#xff0c;接下来请跟随我的步伐走进我的学习笔记世界~ 什么是设计模式&#xff1f;我们为什么需要学习设计模式&#xff1f; 设计模式是可以更好解决问题的一种方案。 这意味着什么&#xff1f;如果你开发的项目的功能是固定的&#xff0c;永…

2023年12月GESP认证C++等级考试(八级)真题试卷

2023年12月GESP认证C等级考试&#xff08;八级&#xff09;真题试卷 题目总数&#xff1a;27 总分数&#xff1a;100 选择题 第 1 题 单选题 小杨要从A城到B城&#xff0c;⼜想顺路游览⼀番。他有两个选项&#xff1a;1、坐⾼铁路到C城游览&#xff0c;再坐⾼铁或飞机到B…

微信小程序制作瀑布流

先看效果&#xff1a; 瀑布流分为左侧和右侧 看代码&#xff1a; <view class"shops-tops"><view id"left"><view class"left"><image src"https://pic.imgdb.cn/item/6583d9d6c458853aef979621.jpg" class&quo…

【解决Typora图片不是显示问题】PicGo+Github+Typora+ onedrive/坚果云 实现笔记同步

【解决Typora图片不是显示问题】PicGo、Github、Typora实现笔记同步 写在前面&#xff1a; typora笔记软件使用记录typora图片上传问题&#xff1a;原因分析&#xff1a;解决方案&#xff1a;PicGoGithubTypora 坚果云/onedrive 实现笔记同步第一步. 设置上传模式&#xff1a;u…

配置BGP的基本示例

BGP简介 定义 边界网关协议BGP&#xff08;Border Gateway Protocol&#xff09;是一种实现自治系统AS&#xff08;Autonomous System&#xff09;之间的路由可达&#xff0c;并选择最佳路由的距离矢量路由协议。早期发布的三个版本分别是BGP-1&#xff08;RFC1105&#xff0…

Python的环境搭建环境配置()

Python 环境搭建 一,下载Python 1.去官网 www.python.org 下载环境 2.如图点击Download 3.选择Windows 4.如图直接下载 5.直接勾选 6.后面就一直默认选项 Win11 安装目录 不能放在C盘的ProgramFIle路径下 二,测试环境是否安装成功 1.winR 输入cmd 2.输入python --versio…

【K8s】2# 使用kuboard管理K8s集群(kuboard安装)

文章目录 安装 Kuboard v3部署计划 安装登录测试 安装 Kuboard v3 部署计划 在正式安装 kuboard v3 之前&#xff0c;需做好一个简单的部署计划的设计&#xff0c;在本例中&#xff0c;各组件之间的连接方式&#xff0c;如下图所示&#xff1a; 假设用户通过 http://外网IP:80…