ARM中多寄存内存访问概念和栈的种类和应用

多寄存器内存访问指令

  • @ 多寄存器内存访问指令
    @ MOV R1,#1
    @ MOV R2,#2
    @ MOV R3,#3
    @ MOV R4,#4
    @ MOV R11,#0x40000020
    @ STM R11,{R1-R4}
    @ 将R1-R4寄存器中的数据存储到内存以R11为起始地址的内存中
    @ LDM R11,{R6-R9}
    @ 将内存中以R11为起始地址的数据读取到R6-R9寄存器中
    @ 当寄存器不连续是使用逗号分隔
    @ STM R11,{R1,R2,R4}
    @ 不管花括号里的顺序如何,存储时永远是低地址存储小编号的寄存器
    @ STM R11,{R3,R1,R4,R2}
    @ 自动索引照样适用多寄存器内存访问指令
    STM R11!,{R1-R4}

多寄存器内存访问指令的寻址方式

  • @ 多寄存器内存访问指令的寻址方式
    @ MOV R1,#1
    @ MOV R2,#2
    @ MOV R3,#3
    @ MOV R4,#4
    @ MOV R11,#0x40000020
    @ 存储完数据在增长地址
    @ STMIA R11!,{R1-R4}
    @ 先增长地址在存储数据
    @ STMIB R11!,{R1-R4}
    @ 先存储玩数据在减少地址
    @ STMDA R11!,{R1-R4}
    @ 先减少地址在存储数据
    @ STMDB R11!,{R1-R4}

栈的种类和应用

  • 栈的概念
    栈的本质就是一段内存,程序运行时用于保存一些临时数据
    如局部变量、函数的参数、返回值、以及程序跳转时需要保护的寄存器
  • 栈的分类
    在这里插入图片描述
  • 空栈和满栈
    根据SP位置来区分,如果空栈的话,先压栈在移动指针,反之如果满栈的话,先移动指针,在压栈
  • 栈的分类
    栈分为空增、空减、满增、满减四种,ARM处理器一般使用满减栈(和之前的STMDB类似,减是往地址小的方向压栈)
  • 代码指令如下:
    @ 栈的种类与使用
    MOV R1,#1
    MOV R2,#2
    MOV R3,#3
    MOV R4,#4
    MOV R11,#0x40000020
    STMDB R11!,{R1-R4}
    LDMIA R11!,{R6-R9}
  • ARM内部一般用字母来表示满增、满减等等
    空增(EA)、空减(ED)、满增(FA)、满减(FD)
  • 汇编代码如下:
    MOV R1,#1
    MOV R2,#2
    MOV R3,#3
    MOV R4,#4
    MOV R11,#0x40000020
    STMFD R11!,{R1-R4}
    LDMFD R11!,{R6-R9}
  • 叶子函数的调用过程举例
    @ 初始化栈指针
    @ MOV SP,#0x40000020
    @MAIN:
    @ MOV R1,#10
    @ MOV R2,#5
    @ BL FUNC
    @ LDMFD SP!,{R1,R2}
    @ ADD R3,R1,R2
    @ B STOP
    @FUNC:
    @压栈保护现场
    @ STMFD SP!,{R1,R2}
    @ MOV R1,#10
    @ MOV R2,#20
    @ SUB R1,R2,R1
    @ MOV PC,LR
  • 非叶子函数的调用过程举例
    @ 初始化栈指针
    MOV SP,#0x40000020
    MAIN:
    MOV R1,#3
    MOV R2,#5
    BL FUNC1
    ADD R3,R1,R2
    B STOP
    FUNC1:
    STMFD SP!,{R1,R2,LR}
    MOV R1,#10
    MOV R2,#20
    BL FUNC2
    SUB R1,R2,R1
    LDMFD SP!,{R1,R2,LR}
    MOV PC,LR
    FUNC2:
    STMFD SP!,{R1,R2}
    MOV R1,#7
    MOV R2,#8
    MUL R3,R1,R2
    LDMFD SP!,{R1,R2}
    MOV PC,LR

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

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

相关文章

基于决策树实现葡萄酒分类

基于决策树实现葡萄酒分类 将葡萄酒数据集拆分成训练集和测试集,搭建tree_1和tree_2两个决策树模型,tree_1使用信息增益作为特征选择指标,B树使用基尼指数作为特征选择指标,各自对训练集进行训练,然后分别对训练集和测…

linux驱动——中断

1.Cortex-A系列的中断的简介 中断的基本概念:(interrupt) 中断本质上是系统内部的异常机制,当中断产生之后,他会停下当前正在执行的任务,转而去做其他的事情,在停下当前正在执行的任务之前,要先入栈(保护现场,其他的事情做完之后…

基于GAN对抗网进行图像修复

一、简介 使用PyTorch实现的生成对抗网络(GAN)模型,包括编码器(Encoder)、解码器(Decoder)、生成器(ResnetGenerator)和判别器(Discriminator)。…

【vue.js】文档解读【day 4】 | 事件处理

如果阅读有疑问的话,欢迎评论或私信!! 文章目录 事件处理前言监听事件内联事件处理器方法事件处理器方法与内联事件判断在内联处理器中调用方法在内联事件处理器中访问事件参数修饰符事件修饰符按键修饰符常规按键别名系统按键别名组合按键ex…

Nomic Embed:能够复现的SOTA开源嵌入模型

Nomic-embed-text是2月份刚发布的,并且是一个完全开源的英文文本嵌入模型,上下文长度为8192。它在处理短文和长文本任务方面都超越了现有的模型,如OpenAI的Ada-002和text-embedding-3-small。该模型有137M个参数在现在可以算是非常小的模型了…

[LeetCode][LCR151]彩灯装饰记录 III——队列

题目 LCR 151. 彩灯装饰记录 III 一棵圣诞树记作根节点为 root 的二叉树,节点值为该位置装饰彩灯的颜色编号。请按照如下规则记录彩灯装饰结果: 第一层按照从左到右的顺序记录除第一层外每一层的记录顺序均与上一层相反。即第一层为从左到右&#xff0c…

鸿蒙报错:Hhvigor Update the SDKs by going to Tools > SDK Manager....

鸿蒙报错:Hhvigor Update the SDKs by going to Tools > SDK Manager… 打开setting里面的sdk,将API9工程下的全部勾上,应用下载 刚打开 js 和 Native 是没勾上的

LeetCode Python - 43.字符串相乘

目录 题目答案运行结果 题目 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。 注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 示例 1: 输入: num1 “2”, …

Pytorch学习 day08(最大池化层、非线性激活层、正则化层、循环层、Transformer层、线性层、Dropout层)

最大池化层 最大池化,也叫上采样,是池化核在输入图像上不断移动,并取对应区域中的最大值,目的是:在保留输入特征的同时,减小输入数据量,加快训练。参数设置如下: kernel_size&#…

AI智能应用百科立即落地实操课

该课程旨在教授学员如何将AI智能应用于实际场景。通过深入的案例研究和实操练习,学员将学会应用机器学习、自然语言处理等技术,快速解决现实问题。课程强调实际操作,帮助学员快速运用AI技术解决工作中的挑战。 课程大小:3.3G 课…

【Java探索之旅】数据类型与变量,字面常量,整型变量

🎥 屿小夏 : 个人主页 🔥个人专栏 : Java入门到精通 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一、字面常量二、数据类型三、变量3.1 变量概念3.2 语法格式 四、整型变量4.1 整型变…

reids设计与实现(一)——数据对象

文章目录 1. 前言2. redis 动态字符串2.1. 字符串的数据结构:2.2. 剖析,length;2.3. 剖析,free;2.3. 使用c字符串函数; 3. redis 链表4. 字典5. 跳跃表 1. 前言 reids作为最常用的缓存数据库,深…