ARM编程指令一

预备知识

1. 寻找地址表现形式
  1. 立即数地址(Immediate Addressing)
LDR R0, =0x2000  // 将立即数 0x2000 作为地址加载到寄存器 R0 中
  1. 寄存器间接寻址(Register Indirect Addressing)
    使用寄存器的值作为内存地址进行数据存取。
LDR R0, [R1]    // 从寄存器 R1 指向的内存地址加载数据到寄存器 R0
STR R2, [R3]    // 将寄存器 R2 中的数据存储到寄存器 R3 指向的内存地址
  1. 寄存器间接加偏移量(Register Indirect with Offset)
    功能:在寄存器指定的基地址上加上一个立即数偏移量来计算实际的内存地址。
LDR R0, [R1, #4]    // 从寄存器 R1 加上偏移量 4 指向的地址加载数据到寄存器 R0
STR R2, [R3, #8]    // 将寄存器 R2 中的数据存储到寄存器 R3 加上偏移量 8 指向的内存地址
  1. 寄存器间接加寄存器偏移(Register Indirect with Register Offset)
    功能:使用一个寄存器的值作为基地址,并将另一个寄存器的值作为偏移量来计算实际的内存地址。偏移量是数而不是地址。
LDR R0, [R1, R2]    // 从寄存器 R1 加上寄存器 R2 指向的地址加载数据到寄存器 R0
STR R3, [R4, R5]    // 将寄存器 R3 中的数据存储到寄存器 R4 加上寄存器 R5 指向的内存地址
  1. 寄存器间接加偏移量与基地址寄存器的递增(Pre-indexed Addressing)
    功能:在访问内存之前,先将一个立即数偏移量加到基地址寄存器的值上。这种方式会修改基地址寄存器的值。
LDR R0, [R1, #4]!    // 从寄存器 R1 加上偏移量 4 指向的地址加载数据到寄存器 R0,并递增寄存器 R1
STR R2, [R3, #8]!    // 将寄存器 R2 中的数据存储到寄存器 R3 加上偏移量 8 指向的内存地址,并递增寄存器 R3
2. #和=的区别
  1. #4是一个立即数
  2. =address,用途:表示一个常量地址或数据值,用于将较大的数值加载到寄存器中。是伪指令
3.

一、数据传输指令

1.MOV指令 Move Register

功能:将一个值从一个寄存器或立即数传输到另一个寄存器

MOV R0, #5      // 将立即数5加载到寄存器R0
MOV R1, R0      // 将寄存器R0的值传输到寄存器R1

二、访存指令

唯二

1.LDR指令 Load Register

功能:从内存中加载数据到寄存器。左<-右

LDR R0, [R1]    // 从寄存器R1指向的内存地址加载数据到寄存器R0
LDR R2, =0x1000 // 将地址0x1000加载到寄存器R2
LDR R3, [R2]    // 从寄存器R2指向的内存地址加载数据到寄存器R3
2. STR指令 Store Register

功能:将寄存器中的数据存储到内存中。左->右

STR R0, [R1]     // 将寄存器 R0 中的数据存储到寄存器 R1 指向的内存地址
STR R2, [R3]     // 将寄存器 R2 中的数据存储到寄存器 R3 指向的内存地址

三、多寄存器访存指令

1. LDM指令 Load Multiple (LDM)

功能:从内存中加载多个寄存器的值。

  • 递增模式(IA):在每次数据加载后,基地址寄存器的值递增。
LDMIA R0!, {R1, R2, R3}//从内存地址 R0 指向的地址开始,依次加载内存中的值到寄存器 R1、R2 和 R3。
R0 在每次加载后递增,直到所有寄存器加载完毕。
  • 递减模式(DA)
LDMDA R0!, {R1, R2, R3}//从内存地址 R0 指向的地址开始(地址递减),依次加载内存中的值到寄存器 R1、R2 和 R3。R0 在每次加载前递减,直到所有寄存器加载完毕。
  • 不更新基地址寄存器
LDMIA R0, {R1, R2, R3}//从内存地址 R0 指向的地址开始,依次加载内存中的值到寄存器 R1、R2 和 R3。基地址寄存器 R0 的值不更新(即没有 !)。
2. STM指令 Store Multiple (STM)

功能:将多个寄存器的值存储到内存中。类似于LDM指令

STMIA R0!, {R1, R2, R3}  // 将寄存器 R1、R2、R3 的值存储到寄存器 R0 指向的内存地址,并在存储后递增 R0

四、栈操作指令

1.PUSH和POP指令

后进先出
功能:PUSH:将寄存器的值压入栈中。
POP:从栈中弹出数据到寄存器。

PUSH {R0, R1}    // 将寄存器 R0 和 R1 的值压入栈中。值得注意是R1先压入栈中
POP {R2, R3}     // 从栈中弹出数据到寄存器 R2 和 R3POP {R2, R3}//从栈中弹出数据到寄存器 R2 和 R3 中。R3存放最先出栈的元素

五、立即数处理指令

1.MOVT Move Top (移动顶部)和MOVW Move Wide (移动宽度)指令

功能:
MOVW:将一个16位立即数加载到寄存器的低16位。
MOVT:将一个16位立即数加载到寄存器的高16位。

MOVW R0, #0x1234  // 将立即数 0x1234 加载到寄存器 R0 的低 16 位
MOVT R0, #0x5678  // 将立即数 0x5678 加载到寄存器 R0 的高 16 位

六、系统控制寄存器操作指令

1. MRS和MSR指令
  1. MRS 和 MSR 是用于处理系统控制寄存器(如程序状态寄存器(CPSR)、控制寄存器等)的指令。它们用于读写这些寄存器的值,从而影响系统的状态和控制。
  2. MRS 指令,全称:Move Register to Status Register
  • 功能:将系统控制寄存器的值读取到通用寄存器中。主要用于从程序状态寄存器(CPSR)或其他控制寄存器读取数据。
  1. MSR 指令,全称:Move Status Register to Register
  • 功能:将通用寄存器的值写入到系统控制寄存器中。主要用于设置程序状态寄存器(CPSR)或其他控制寄存器的值。
MRS R0, CPSR  // 将当前程序状态寄存器 (CPSR) 的值加载到寄存器 R0 中
MSR CPSR, R0  // 将寄存器 R0 的值写入当前程序状态寄存器 (CPSR)

七、汇总

ARM汇编指令汇总

类别指令功能描述示例代码
数据传输指令MOV将数据从一个寄存器或立即数传输到另一个寄存器MOV R0, #5
MOV R1, R0
访存指令LDR从内存中加载数据到寄存器LDR R0, [R1]
LDR R2, =0x1000
LDR R3, [R2]
STR将寄存器中的数据存储到内存中STR R0, [R1]
STR R2, [R3]
多寄存器访存指令LDM从内存中加载多个寄存器的值LDMIA R0!, {R1, R2, R3}
LDMDA R0!, {R1, R2, R3}
LDMIA R0, {R1, R2, R3}
STM将多个寄存器的值存储到内存中STMIA R0!, {R1, R2, R3}
栈操作指令PUSH将寄存器的值压入栈中PUSH {R0, R1}
POP从栈中弹出数据到寄存器POP {R2, R3}
立即数处理指令MOVW将一个 16 位立即数加载到寄存器的低 16 位MOVW R0, #0x1234
MOVT将一个 16 位立即数加载到寄存器的高 16 位MOVT R0, #0x5678
系统控制寄存器操作指令MRS将系统状态寄存器(如 CPSR)的值读取到通用寄存器中MRS R0, CPSR
MSR将通用寄存器中的值写入到系统状态寄存器(如 CPSR)中MSR CPSR, R0

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

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

相关文章

oracle 查询锁表

oracle 查询锁表 SELECT o.object_name, s.sid, s.serial#, p.spid, s.username, s.program FROM v l o c k e d o b j e c t l J O I N d b a o b j e c t s o O N l . o b j e c t i d o . o b j e c t i d J O I N v locked_object l JOIN dba_objects o ON l.object_id …

ufw命令简介

正文共&#xff1a;3999 字 41 图&#xff0c;预估阅读时间&#xff1a;4 分钟 我们之前在CentOS系统中研究了iptables命令的使用方法&#xff08;iptables命令简介&#xff09;&#xff0c;还做了简单的应用实验&#xff08;如何通过iptables配置URL过滤黑名单&#xff1f;、如…

速盾 CDN 提高网络安全性的方法有哪些?

CDN&#xff08;内容分发网络&#xff09;是一种广泛应用于互联网的网络架构&#xff0c;其主要目的是提高网站的访问速度和网络安全性。速盾 CDN 作为一家网络安全服务提供商&#xff0c;采取了多种方法来提高网络安全性。 首先&#xff0c;速盾 CDN 利用分布式架构来提高网络…

Vue3 + Vite 打包引入图片错误

1. 具体报错 报错信息 报错代码 2. 解决方法 改为import引入&#xff0c;注意src最好引用为符引入&#xff0c;不然docker部署的时候可能也会显示不了 <template><img :src"loginBg" alt""> </template><script langts setup> …

LinkedList与链表(1万多字超级详细版本)

一. ArrayList的缺陷 上个博客已经熟悉了ArrayList的使用&#xff0c;并且进行了简单模拟实现。通过源码知道&#xff0c;ArrayList底层使用数组来存储元素&#xff1a; public class ArrayList < E > extends AbstractList < E > implements List < E &g…

深入解析DDoS攻击:原理、危害与防御策略

在日新月异的网络时代&#xff0c;DDoS攻击&#xff08;分布式拒绝服务攻击&#xff09;如同一把无形的利剑&#xff0c;悬挂在每一个互联网参与者的头顶。随着技术的飞速进步与网络环境的日益复杂&#xff0c;DDoS攻击不仅频次激增&#xff0c;其破坏力也愈发惊人。据2023年网…

JSON.parse()和JSON.stringify()用法

JSON.parse() 方法用于将 JSON 格式的字符串转换为 JavaScript 对象&#xff0c;而 JSON.stringify() 方法用于将 JavaScript 对象转换为 JSON 字符串。这两个方法可以组合使用来实现将数据从对象到字符串再到对象的转换。 示例 // 创建一个包含属性的 JavaScript 对象 var pe…

国际奥委会主席巴赫:阿里AI技术将巴黎奥运转播带到新高度

7月26日&#xff0c;巴黎奥运会开幕在即&#xff0c;国际奥委会主席巴赫在国际转播中心举行的活动中表示&#xff0c;2024巴黎奥运会展现了奥运转播的未来&#xff0c;广泛应用的阿里AI技术正在将巴黎奥运转播带到新的高度。 &#xff08;国际奥委会主席巴赫&#xff09; 在巴黎…

SQLite基础:简介、安装和命令

文章目录 1. SQLite简介1.1 SQL 和 SQLite 之间的差异1.2 SQLite 特性 2. SQLite安装3. SQLite命令4. SQLite点命令 1. SQLite简介 SQLite 是嵌入式关系数据库管理系统。它是自包含、无服务器、零配置和事务性 SQL 数据库引擎。其与大多数其他 SQL 数据库不同&#xff0c;SQLi…

自定义Linux操作日志配置

方案一&#xff1a;使用acct工具记录 步骤 1 通过设置日志文件可以对每个用户的每一条命令进行纪录&#xff0c;这一功能默认是不开放的&#xff0c;为了打开它&#xff0c;我们要确认已经安装了acct工具&#xff1a; # Debian、Ubuntu、SUSE下叫acct apt-get install acct…

视觉SLAM第一讲

第一讲-预备知识 SLAM是什么&#xff1f; SLAM&#xff08;Simultaneous Localization and Mapping&#xff09;是同时定位与地图构建。 它是指搭载特定传感器的主体&#xff0c;在没有环境先验信息的情况下&#xff0c;于运动过程中建立环境的模型&#xff0c;同时估计自己…

TCP/IP面试三道题

针对TCP/IP的面试题&#xff0c;我将从简单到困难给出三道题目&#xff0c;并附上参考答案的概要。 1. 简单题&#xff1a;请简述TCP/IP协议族的基本组成&#xff0c;并说明每一层的主要功能。 参考答案&#xff1a; TCP/IP协议族是一个由不同层次组成的协议集合&#xff0c…

长效IP有哪些应用场景?

不同于经常重置的短效IP&#xff0c;长效IP以其长久稳定的特性&#xff0c;为各行各业提供了更为广阔的应用舞台。今天&#xff0c;就让我们一起探索极光http这一长效IP服务的魅力&#xff0c;看看它是如何成为众多领域首选的。 1. 远程工作的稳定后盾 在远程办公日益普及的今…

昇思25天学习打卡营第23天|LSTM+CRF序列标注

Mindspore框架CRF条件随机场概率图模型实现文本序列命名实体标注|&#xff08;一&#xff09;序列标注与条件随机场的关系 Mindspore框架CRF条件随机场概率图模型实现文本序列命名实体标注|&#xff08;二&#xff09;CRF模型构建 Mindspore框架CRF条件随机场概率图模型实现文本…

【Beyond Compare】Beyond Compare下载、安装与使用详细教程

目录 &#x1f33a;1 概述 &#x1f384;2 Beyond Compare 安装包下载 &#x1f33c;3 安装详细教程 &#x1f342;4 免费注册 &#x1f30d;5 使用详情 &#x1f33a;1 概述 Beyond Compare 是一款强大的文件和文件夹比较工具&#xff0c;广泛应用于软件开发、文档管理和…

枚举单例是怎么保证线程安全和防止反射的

枚举单例在Java中具有天然的线程安全性和防止反射攻击的特性&#xff0c;这是由于Java对枚举类型的特殊处理方式。以下是详细解释&#xff1a; 1. 线程安全性 Java 枚举类的特性 类加载机制&#xff1a;枚举类型在Java中是特殊的类&#xff0c;由JVM保证其线程安全性。枚举类…

Web动画(lottie篇)

一、Lottie简介 Lottie是一个库&#xff0c;可以解析使用AE制作的动画&#xff08;需要用bodymovin导出为json格式&#xff09;&#xff0c;支持web、ios、android和react native。在web侧&#xff0c;lottie-web库可以解析导出的动画json文件&#xff0c;并将其以svg或者canva…

linux time使用

关于linux内 时间获取的数据结构和api函数比较&#xff0c;看具体需要什么样的了 一般只是需要获取系统时间计算下时间差值&#xff0c; 毫秒的 static int time_flag 0; ktime_t time_now_ms ktime_get(); static ktime_t time_last_ms ktime_get(); ktime_t…

electron调试

electron 调试 electron 的调试分两步&#xff0c;界面的调试&#xff0c;和主进程的调试。 界面调试类似浏览器F12&#xff0c;可是调试不到主进程。 主进程调试有vscode、命令行提示和外部调试器调试。 本篇记录的练习是vscode调试。命令行和外部调试器的方式可以参考官网&a…

通过NPOI读取Excel内容导入到数据库

系统中经常用需要读取Excel文件中的数据&#xff0c;导入到数据库&#xff0c;下面是一个示例。 vs&#xff1a;2022 框架&#xff1a;abpvnext 3.1 把Excel中的数据导入到数据库 /// <summary> /// 导入 /// </summary> /// <param name"formFile"…