2023/9/28 -- ARM

news2024/12/28 11:18:39

【内存读写指令】

int *p=0X12345678
*p=100;//向内存中写入数据
int a= *p;//从内存读取

1.单寄存器内存读写指令

1.1 指令码以及功能

向内存中写:
str:向内存中写一个字(4字节)的数据
strh:向内存写半个字(2字节)的数据
strb:向内存写一个字节的数据
从内存读:
ldr:从内存读取一个字的数据
ldrh:从内存读取半个字的数据
ldrb:从内存读取一个字节的数据

1.2 格式

指令码{条件码} 目标寄存器 [目标地址]
str 目标寄存器 ,[目标地址]:将目标寄存器的数据写入到以目标地址为起始的内存中
ldr 目标寄存器 ,[目标地址]:从以目标地址为起始的内存中读一个字的数据到目标寄存器

1.3 示例

 mov r1,#0XFFFFFFFF
    ldr r2,=0X40000000
    @向内存写入
    str r1,[r2]
    @从内存读
    ldr r3,[r2]

1.4 单寄存器读写的地址索引方式

1.前索引
   mov r1,#0XFFFFFFFF
    ldr r2,=0X40000000
        str r1,[r2,#8]@将r1寄存器的值保存到r2+8为起始地址的内存中
    ldr r3,[r2,#8]@从r2+8为起始地址的内存中读
 2.后索引
      mov r1,#0XFFFFFFFF
    ldr r2,=0X40000000
     str r1,[r2],#8  @将r1寄存器的值保存到r2为起始地址的内存中,r2值=让r2+8
  3.自动索引
  mov r1,#0XFFFFFFFF
  ldr r2,=0X40000000
     str r1,[r2,#8]!  @将r1寄存器的值保存到r2+8为起始地址的内存中,r2=r2+8

2.批量寄存器的内存读写方式

2.1 指令码以及格式

向内存写:
    stm 目标地址,{寄存器列表}
    将寄存器列表中每一个寄存器的值都写道目标地址指向的连续空间之中
从内存读
    ldm 目标地址,{寄存器列表}
    将目标地址指向的连续内存中的数据读到寄存器列表中的寄存器中
    
    注意事项:
    1.如果寄存器列表中寄存器的编号连续,可以用-表示列表,如果不连续,用,分割寄存器
        {r1-r5,r7}
    2.无论寄存器列表中如何表示,我们在读写内存的时候始终是低地址 对应低寄存器编号

2.2 示例代码

mov r1,#1
    mov r2,#2
    mov r3,#3
    mov r4,#4
    mov r5,#5
    ldr r6,=0X40000000
    stm r6,{r1,r2,r3,r4,r5}  @将r1-r6寄存器的值写道r6指向的连续内存中
    ldm r6,{r7,r8,r9,r10,r11}@从r6指向的连续内存中读取数据保存到r7-r11寄存器中

2.3 批量寄存器的地址增长方式

每次向指定寄存器保存的地址中写入一个数据,保存地址的寄存器保存的地址也会发生相应的改变

 mov r1,#1
    mov r2,#2
    mov r3,#3
    mov r4,#4
    mov r5,#5
    ldr r6,=0X40000000
    stm r6!,{r1-r5}
    先向r6指向的内存中写一个数据,然后r6保存的地址向地址大的方向增长
ia后缀
 mov r1,#1
    mov r2,#2
    mov r3,#3
    mov r4,#4
    mov r5,#5
    ldr r6,=0X40000000
    stmia r6!,{r1-r5}
    先向r6指向的内存中写一个数据,然后r6保存的地址向地址大的方向增长
ib后缀
mov r1,#1
    mov r2,#2
    mov r3,#3
    mov r4,#4
    mov r5,#5
    ldr r6,=0X40000000
    stmib r6!,{r1-r5}
 
 先让R6寄存器保存的地址往地址大的方向增长,再向R6寄存器保存的地址中写入数据
 
da后缀
mov r1,#1
    mov r2,#2
    mov r3,#3
    mov r4,#4
    mov r5,#5
    ldr r6,=0X40000800
    stmda r6!,{r1-r5}
 先向R6指向的内存中存数据,然后R6寄存器保存的地址往地址小的方向增长
dB后缀
  mov r1,#1
    mov r2,#2
    mov r3,#3
    mov r4,#4
    mov r5,#5
    ldr r6,=0X40000800
    stmdb r6!,{r1-r5}
 先将R6寄存器保存的地址往地址小的方向增长,再往R6寄存器保存的地址内存中存入数据

 mov r1,#1
    mov r2,#2
    mov r3,#3
    mov r4,#4
    mov r5,#5
    ldr r6,=0X40000000
    stmia r6!,{r1-r5}   @ia存,db取
    ldmdb  r6!,{r7-r11}
    

3.栈内存读写

栈指针寄存器:R13/SP

栈:栈本质上就是一段内存,我们在内存中指定一片区域用于保存一些临时数据,这片区域就是栈区

3.1 栈的类型

增栈:压栈结束后,栈顶往地址大的方向增长
减栈:压栈结束后,栈顶往地址小的方向增长
空栈:压栈结束后,栈顶区域没有有效数据
满栈:压栈结束后,栈顶区域存放有效数据

空增栈(EA)/空减栈(ED)/满增栈(FA)/满减栈(FD)
ARM使用的栈是满减栈

3.2 满减栈压栈出栈操作

ex1:
  ldr sp,=0X40000020 @指定顶地址
    mov r1,#1
    mov r2,#2
    mov r3,#3
    mov r4,#4
    mov r5,#5
    push {r1-r5} @压栈
    pop {r6-r10}  @将栈顶元素数值出栈
ex2:
    ldr sp,=0X40000020 @指定顶地址
    mov r1,#1
    mov r2,#2
    mov r3,#3
    mov r4,#4
    mov r5,#5
    STMDB sp!,{r1-r5} @压栈
    LDMIA sp!,{r6-r10}  @将栈顶元素数值出栈
EX3:
    ldr sp,=0X40000020 @指定顶地址
    mov r1,#1
    mov r2,#2
    mov r3,#3
    mov r4,#4
    mov r5,#5
    STMfd sp!,{r1-r5} @压栈
    LDMfd sp!,{r6-r10}  @出栈

4.栈实例---叶子函数的调用过程

.text  
.global _start 
            

_start:
    ldr sp,=0X40000020 @初始化栈
    b main
main:
    mov r1,#1
    mov r2,#2
    bl func
    add r3,r1,r2
    b main

func:
@压栈保护现场
    stmfd sp!,{r1,r2}
    mov r1,#3
    mov r2,#4
    sub r4,r2,r1
    @出栈恢复现场
    ldmfd sp!,{r1,r2}
    mov pc,lr  @返回main函数
    
    
wh: 
    b wh  
    
.end 
    

5.栈实例---非叶子函数的调用过程

.text  
.global _start 
            

_start:
    ldr sp,=0X40000020 @初始化栈
    b main
main:
    mov r1,#1
    mov r2,#2
    bl func
    add r3,r1,r2
    b main

func:
@压栈保护现场
    stmfd sp!,{r1,r2,lr}
    mov r1,#3
    mov r2,#4
    bl fun1
    sub r4,r2,r1
    @出栈恢复现场
    ldmfd sp!,{r1,r2,lr}
    mov pc,lr  @返回main函数
fun1:
@压栈保护现场
    stmfd sp!,{r1,r2}
    mov r1,#4
    mov r2,#5
    mul r5,r1,r2
    @出栈恢复现场
    ldmfd sp!,{r1,r2}
    mov pc,lr
    
    
wh: 
    b wh  
    
.end 
    

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

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

相关文章

TS中Class类的继承

我们有下面一个代码,其中创建了一个Dog类和Cat类,这两个类中都有姓名和年龄属性和bark方法 class Dog {name: string;age: number;constructor(name: string, age: number) {this.name name;this.age age;}bark() {console.log(this.name "汪汪…

温故 Spring5 特性

一、前言 随着技术的不断发展,Spring框架也在不断地更新迭代。我们将温故Spring 5的特性,并探讨如何在实际项目中应用这些特性来提升开发效率和系统性能。 Spring 5是Spring框架的一个重要版本,它带来了许多新特性,包括对Java 8…

Eclipse iceoryx(千字自传)

1 在固定时间内实现无任何限制的数据传输 在汽车automotive、机器人robotics和游戏gaming等领域,必须在系统的不同部分之间传输大量数据。使用Linux等操作系统时,必须使用进程间通信(IPC)机制传输数据。Eclipse iceoryx是一种中间件,它使用零拷贝Zero-Copy、共享内存Share…

MySQL笔记(进阶篇)

包含内容: 存储引擎 索引 SQL优化 视图/存储过程/触发器 锁 InnoDB引擎 MySQL管理 存储引擎 MySQL体系结构 连接层:最上层是一些客户端和连接服务,主要完成一些类似于连接处理,授权认证,及相关的安全方案.服务器也会为安全接入的每个客户验证它所…

SAP配置BOM数据结构详解-整车(SAP配置BOM攻略十)

一、MBOM数据 1、一个产品由多个物料构成,每个物料构成MBOM的一行。 2、工程变更号在BOM数据中是必须的。变更号的实质是通过变更号指向某个生效日期。通过变更号关联的日期区间,可用决定这个物料数据是否启用。 二、特征数据 1、一个车可用分类为多个…

P1-P5_动手学深度学习-pytorch(李沐版,粗浅的笔记)

目录 预告  1.学习深度学习的关键是动手  2.什么是《动手学深度学习》  3.曾经推出的版本(含github链接) 一、课程安排  1.目标  2.内容  3.上课形式  4.你将学到什么  5.资源 二、深度学习的介绍  1.AI地图  2.深度学习在一些应用上…

【数据结构与算法】之“堆”介绍

目录 堆的基本存储 一、概念及其介绍 二、适用说明 三、结构图示 堆的 shift up 堆的 shift down 基础堆排序 一、概念及其介绍 二、适用说明 三、过程图示 优化堆排序 索引堆及其优化 一、概念及其介绍 二、适用说明 三、结构图示 堆的基本存储 一、概念及其介…

SiegedSec 黑客组织袭击北约网络系统

Security Affairs 网站披露,一个名为 SiegedSec 的网络攻击组织近期成功入侵了北约网络系统,并在网上散布盗取的大量非机密文件。 目前,北约正在就此事展开积极调查,其所属官员发表声明表示,北约内部已经组织了大量的网…

智能导览与实时监测:数字孪生助力景区管理

在当今旅游业快速发展的背景下,景区“人流管理”成为了一个越来越重要的问题。数字孪生技术由于其自身优势,可以为景区管理者提供更智能、更高效的管理方案。本文结合山海鲸可视化几个数字孪生案例带大家一起了解数字孪生在景区人流管理方面的应用&#…

计算机竞赛 题目:基于深度学习卷积神经网络的花卉识别 - 深度学习 机器视觉

文章目录 0 前言1 项目背景2 花卉识别的基本原理3 算法实现3.1 预处理3.2 特征提取和选择3.3 分类器设计和决策3.4 卷积神经网络基本原理 4 算法实现4.1 花卉图像数据4.2 模块组成 5 项目执行结果6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 基…

架构师选择题--计算机网络

架构师选择题--计算机网络 真题 真题 d http:80 https:httpssl :443 b b pop3是邮件接收协议:110 SMTP是邮件发送协议:25 http:80 A 网络隔离:防火墙(逻辑),网闸(物理) …

OpenCV4(C++) —— 图像数据类型转换和颜色模型转换

文章目录 一、图像数据类型转换二、颜色模型转换三、通道的分离和融合 一、图像数据类型转换 OpenCV中使用imread读取一张彩色图像时,默认采用的是BGR通道和整数类型(0-255,CV_8U)。 在某些情况下,会将整数类型(0-255)转换为浮点类型(0-1)&a…

助力电力行业数字化转型:智慧风电项目介绍

智慧电力作为电力领域的突破性进展,旨在实现能源领域的数字化转型。智慧电力借助数字孪生、IOT、云计算等技术,将传统的电力系统升级为高智能、高效能的系统,助力传统能源企业实现数字化转型。下面让我们来看一看山海鲸可视化提供的智慧电力相…

c#利用Chart 画图

c#利用Chart 画图 添加画图组件 编写代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; …

【网络安全-sql注入(5)】sqlmap以及几款自动化sql注入工具的详细使用过程(提供工具)

一,sqlmap 工具的详细使用 kali系统自带这个工具,无需安装直接sqlmap 后面接参数使用 Windows上参照以下方法安装即可 1-1 工具下载 1-1-1 sqlmap下载 sqlmap 工具下载地址: GitHub - sqlmapproject/sqlmap: Automatic SQL injection a…

6-6 两个有序链表序列的合并 分数 10

List Merge(List L1, List L2) {if (L1 NULL)return L2;if (L2 NULL)return L1;// 定义指针p和q分别指向链表L1和L2的头结点List p L1->Next;List q L2->Next;// 定义新链表的头结点和指针rList head (List)malloc(sizeof(struct Node));head->Next NULL;List r…

WinScope跟踪window/layer pb文件

WinScope web用来跟踪分析WindowManager或SurfaceFlinger在window转换期间和转换后的状态,跟踪记录会被写入 /data/misc/wmtrace/wm_trace.pb 和 /data/misc/wmtrace/layers_trace.pb,同时还会包含在错误报告中。 一、下载winscope.html curl https://a…

Cocos Creator3.8 项目实战(四)巧用九宫格图像拉伸

一、为什么要使用九宫格图像拉伸 相信做过前端的同学都知道,ui (图片)资源对包体大小和内存都有非常直接的影响。 通常ui 资源都是图片,也是最占资源量的资源类型,游戏中的ui 资源还是人机交互的最重要的部分&#xff…

阿里影业+大麦,开启大文娱新纪元?

被“精心呵护”长达十年后,阿里大文娱在今年终于踏上了关键节点。 3月份,阿里“16N”组织大变革后,大文娱集团独自上路。8月,“分家”后的第一份财报显示,阿里大文娱集团成功大幅扭亏,实现了首次季度经调整…

ToBeWritten之狩猎恶意攻击者

也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 转移发布平台通知:将不再在CSDN博客发布新文章,敬…