2023/9/28 -- ARM

【内存读写指令】

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,#0XFFFFFFFFldr r2,=0X40000000@向内存写入str r1,[r2]@从内存读ldr r3,[r2]

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

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

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

2.1 指令码以及格式

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

2.2 示例代码

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

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

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

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

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

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

.text  
.global _start _start:ldr sp,=0X40000020 @初始化栈b main
main:mov r1,#1mov r2,#2bl funcadd r3,r1,r2b mainfunc:
@压栈保护现场stmfd sp!,{r1,r2}mov r1,#3mov r2,#4sub 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,#1mov r2,#2bl funcadd r3,r1,r2b mainfunc:
@压栈保护现场stmfd sp!,{r1,r2,lr}mov r1,#3mov r2,#4bl fun1sub r4,r2,r1@出栈恢复现场ldmfd sp!,{r1,r2,lr}mov pc,lr  @返回main函数
fun1:
@压栈保护现场stmfd sp!,{r1,r2}mov r1,#4mov r2,#5mul r5,r1,r2@出栈恢复现场ldmfd sp!,{r1,r2}mov pc,lrwh: b wh  .end 

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

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

相关文章

关于crypto1_bs

代码地址 GitHub - aczid/crypto1_bs: Bitsliced Crypto-1 brute-forcer Bitsliced Crypto-1 暴力破解器 使用位切片方法的 Crypto-1 密码的纯 C(99) 实现,它使用 GNU 向量扩展来跨 SSE/AVX/AVX2 支持架构移植,同时提供尽可能高的并行性。 背景 我写这篇…

asp.net core 如何统一json序列化格式

oldconfig.AllFields Newtonsoft.Json.JsonConvert.SerializeObject(sqlParameters.AllFields);在start.cs文件中 JsonConvert.DefaultSettings new Func<JsonSerializerSettings>(() >{JsonSerializerSettings jsonsetting new JsonSerializerSettings(){Formatt…

布隆过滤器及其用法

1 定义 布隆过滤器(Bloom Filter, BF)是由Howrad Bloom在1970年提出的一种具有高效时间和空间效率的二进制向量数据结构&#xff0c;用来检测一个元素是不是属于这个集合。注意&#xff0c;布隆过滤器只判断是否出现在集合中&#xff0c;无法给出元素在集合中的具体位置。 1.1…

HubSpot成功全靠它?集客营销大揭秘

在当今数字化的商业世界中&#xff0c;吸引、转化和维护客户已经变得更具挑战性和复杂性。然而&#xff0c;有一家公司已经成功地帮助数千家企业实现了集客营销的成功。这家公司就是HubSpot。那么&#xff0c;HubSpot的成功到底全靠了什么&#xff1f;让我们揭开集客营销的大秘…

openGauss学习笔记-92 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用MOT SQL覆盖和限制

文章目录 openGauss学习笔记-92 openGauss 数据库管理-内存优化表MOT管理-内存表特性-使用MOT-MOT使用MOT SQL覆盖和限制92.1 不支持的特性92.2 MOT限制92.3 不支持的DDL操作92.4 不支持的数据类型92.5 不支持的索引DDL和索引92.6 不支持的DML92.7 不支持的JIT功能&#xff08;…

3D孪生场景搭建:3D漫游

上一篇 文章介绍了如何使用 NSDT 编辑器 制作模拟仿真应用场景&#xff0c;今天这篇文章将介绍如何使用NSDT 编辑器 设置3D漫游。 1、什么是3D漫游 3D漫游是指基于3D技术&#xff0c;将用户带入一个虚拟的三维环境中&#xff0c;通过交互式的手段&#xff0c;让用户可以自由地…

前端作业(17)

之后的20个作业&#xff0c;学自【20个JavaScript经典案例-哔哩哔哩】 https://b23.tv/kVj1P5f 支付倒计时 1. 支付10s倒计时 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compat…

跨境必备!WhatsApp营销——注册、养号、防封号!

前面的文章&#xff0c;我们给大家介绍了WhatsApp营销的定义以及重要性&#xff0c;相信许多跨境小伙伴已经摩拳擦掌&#xff0c;迫不及待讲WhatsApp纳入您的全渠道营销策略。当然&#xff0c;工欲善其事&#xff0c;必先利其器&#xff0c;拥有安全的WhatsApp号与登录环境会让…

【网络安全 --- kali2022安装】kali2022 超详细的安装教程(提供镜像)

如果你还没有安装vmware 虚拟机&#xff0c;请参考下面博客安装 【网络安全 --- 工具安装】VMware 16.0 详细安装过程&#xff08;提供资源&#xff09;-CSDN博客【网络安全 --- 工具安装】VMware 16.0 详细安装过程&#xff08;提供资源&#xff09;https://blog.csdn.net/m0…

【gcc】RtpTransportControllerSend学习笔记 3:gcc

本文是大神 https://www.cnblogs.com/ishen 的文章的学习笔记。大神的webrtc源码分析(8)-拥塞控制(上)-码率预估 详尽而具体,堪称神作。本文使用的代码是m79 ,与大神有不同。2.4 Probe只会在一些特殊的时候才会进行探测(链路刚开始时, 码率不正常暴跌时)2.5 : 对发送的吞吐量…

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

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

解决 Jenkins 性能缓慢的问题~转

解决 Jenkins 性能缓慢的问题 Docker中文社区 ​​ 计算机技术与软件专业技术资格持证人 2 人赞同了该文章 没有什么比缓慢的持续集成系统更令人沮丧的了。它减慢了反馈循环并阻止代码快速投入生产。虽然像使用性能更好的服务器可以为您争取时间&#xff0c;但您最终必须投资…

UG\NX CAM二次开发 获取当前加工导航器选中的对象数量和tag UF_UI_ONT_ask_selected_nodes

文章作者:代工 来源网站:NX CAM二次开发专栏 简介: UG\NX CAM二次开发 获取当前加工导航器选中的对象数量和tag UF_UI_ONT_ask_selected_nodes 效果: 代码: void MyClass::do_it() {//获取当前加工导航器选中的对象数量和TAGint count = 0;tag_t* objects = NULL…

stm32 - 中断

stm32 - 中断 概念中断向量表NVIC 嵌套中断向量控制器优先级 中断EXTI概念基本结构例子- 对射式红外传感器计次例子 - 旋转编码器 概念 stm32 支持的中断资源&#xff08;都属于外设&#xff09; EXTITIMADCUSARtSPII2C stm32支持的中断 内核中断 外设中断 中断通道与优先级 一…

物联网AI MicroPython传感器学习 之 噪音测量传感器

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 一、产品简介 麦克风噪音测量传感器&#xff0c;通过单片机对信号的简单处理&#xff0c;可实环境音检测、声控开关这样的有趣实验。传感器模块仅占用一个IO口&#xff0c;通过电压强度&#xff08;mV&#…

IIS部署Flask

启用 CGI 安装wfastcgi pip install wfastcgi 启用 wfastcgi 首先以管理员身份运行wfastcgi-enable来在IIS上启用wfastcgi&#xff0c;这个命令位于c:\python_dir\scripts&#xff0c;也就是你需要确保此目录在系统的PATH里&#xff0c;或者你需要cd到这个目录后再执行。 #…

MVC架构和DDD架构的区别?

前言 最近在学习一个开源社区项目&#xff0c;第一次听说了DDD项目架构&#xff0c;于是通过搜索之后来分享给大家 正文 当涉及到软件架构时&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;和DDD&#xff08;Domain-Driven Design&#xff09;是两种常见的设…

cpp primer plus笔记07-内存模型和命名空间

对于相同变量名的变量&#xff0c;CPP会覆盖作用域大的变量&#xff0c;而使用作用域小的变量&#xff0c;如果想在函数体内使用全局的变量可以在变量名前加上::加以区分&#xff0c;比如warm3会使得局部的warm变量等于3&#xff0c;而::warm3会使得全局的warm3 。 存储描述持…

rpm安装mysql8后碰到的问题

1 mysqld 无法启动 原因 已经使用了3306端口&#xff0c;修改my.cnf中端口为3308 2 修改为3308端口后&#xff0c;还是无法启动&#xff0c; 2023-10-07T02:20:10.096689Z 0 [ERROR] [MY-010262] [Server] Cant start server: Bind on TCP/IP port: Permission denied 2023…

Node-RED系列教程-25node-red获取天气

安装节点:node-red-contrib-weather 节点图标如下: 使用说明:node-red-contrib-weather (node) - Node-RED 流程图中填写经度和纬度即可。 演示: json内容: {