内存操作指令

1. 内存操作指令

一次读写 4个字节 

ldr : 读内存 数据到 寄存器中

str : 写内存 将寄存器中的 数据 写入到内存 

ldrb / strb  一次读写 1个字节

ldrh / strh  一次读写 2个字节 

2. 定义类型和访问

2.1 定义

.data   @ 数据段
@整型 int a =5
a:  .word 5@字符型 char c = 'a'
c:  .Byte 'a'.Byte 0   @ 空一个内存位置  以满足下一个内存地址是2字节对齐的@短整型 short x = 7
x:  .short 7@ 数组int arr[5] = {1,2,3,4,5}
arr: .word 1,2,3,4,5

2.2 访问和写入

2.2.1 整型的读写

@访问整型
ldr r0,=a @将a的地址存放到r0
ldr r1,[r0] @r1 = *r0
@写入
mov r2,#8
str r2,[r0] @*r0 = r2nop

2.2.2 char和short的读写

@char和short的读写
ldr r0,=c 
ldrb r1,[r0] @ 读一个字节
ldr r0,=x
ldrh r1,[r0] @ 读两个字节 

3 访问数组

3.1 前索引

*(p+1) 前索引

就是这样的造型     ldr r2,[r0, #4]     @ arr[1]  *(arr+1)

@前索引
ldr r0,=arr
ldr r1,[r0, #0]   @ r1 = arr[0]   *(p+1) 这里和下面的0 4 8 是因为整型4字节对齐
ldr r2,[r0, #4]   @ r2 = arr[1]
ldr r3,[r0, #8]   @ r2 = arr[2]
@ ....

3.2 后索引

*p++

@ 后索引
ldr r1,[r0],#4     @ 先把r0取出来,然后自增4字节 相当于 *p++;
ldr r2,[r0],#4
ldr r3,[r0],#4
@ ....

3.3 自动索引

*++p

@自动索引
ldr r1,[r0,#4]!  @ *++p;  先p++,然后再*P

4. 多寄存器操作指令: 

4.1 ldm和stm

ldm  :  连续从内存中 取多个整型数据到 指定的多个寄存器中 

@多寄存器操作指令
ldr r0,=arr
ldm r0,{r1-r5}   @ 将r0地址后的 5个整型数据 取出依次放到R1-R5中
@ldm r0,{r1,r3-r5,r7}   @ 将r0地址后的 5个整型数据 放入r1,r3-r5,r7中

stm  :  将多个寄存器中的 数据  写入到 连续的内存中

@多寄存器操作指令
ldr r0,=arr
stm r0,{r6-r10}  @ 将r6-r10中的值 全部依次写入r0对应的地址中

4.2 栈操作: 

满栈:  栈指针指向的位置 有数据 

空栈:  栈指针指向的位置 无数据 

增栈:  存入数据时 栈指针在向大地址方向移动  

减栈:  存入数据时 栈指针在向小地址方向移动   

满增栈:  入栈 *++p   出栈 *p--;

满减栈:  入栈 *--p   出栈 *p++;

空增栈:  入栈 *p++   出栈 *--p; 

空减栈:  入栈 *p--   出栈 *++p; 

C标准指定: 栈使用 满减栈  fd后缀 

ldmfd  满减栈 出栈 

stmfd  满减栈 入栈 

4.2.1  栈的操作流程 

定义栈空间
@ 定义栈空间 
stack_start:.space 1024 @给栈控件1024字节大小的空间
stack_end:
操作栈
@栈操作方式 
@sp栈指针
@ 栈初始化  本质就是给sp赋值为一段内存空间 
ldr sp,=stack_end  @ 因为采用满减栈, 因此栈底在大地址方向
stmfd sp!,{r0-r12}  @ 将r0-r12寄存器入栈保存 且栈指针要移动
ldmfd sp!,{r0-r12}  @ 从栈中 恢复 r0-r12的值 

5. 函数

了解即可

func: @ r0-r3 入参@ 将r4-r12  入栈保存stmfd sp!,{r4-r12,lr}mov r12,sp   @  保存 原始栈顶@ 定义了局部变量 int a =5;mov r0,#5 stmfd sp!,{r0}  @ 局部变量入栈@ ....ldr r10,[sp]  @ 访问局部变量a@ 函数返回 mov sp, r12@ 恢复 r4-r12  弹栈  return ldmfd sp!,{r4-r12,pc}NOP 

6. 内存交换指令

实现 同步互斥 保证原子操作的一种手段 

swp r2,r1,[r0]   将r0地址中的数据取出到R2中,同时将r1中数据放入到R0地址中

了解即可

6.1 互斥锁: 逻辑 

假设r0 互斥锁标记  0 没上锁   1 上锁了 

这种操作先读然后再写,这个两个步骤了,操作有可能再中间被打断,不能保证操作的原子性

if( R0 )阻塞等待else R0 = 1;  @ 操作可能会被打断 

这种的使用swp 时读取和写入是一条指令,cpu打断一条指令的最小单位是,一条指令,所以,swp不可能别打断,保证了操作的原子性

R1 = 1;swp r2,R1,[r0]  @ 对R0地址的 读写操作是原子性的 if (r2) 阻塞等待else 处理互斥内容

7. 特权指令: 该指令只能在 特权模式下可以执行 

CPSR,SPSR进行读写操作

mrs/msr 

@特权指令 msr/mrs 
mrs r0,cpsr  @ 将cpsr中的值 取出 存放到 R0中
MOV R0,#0XD0   @1101 0000
msr cpsr,R0  @ 将r0中的值 写入到cpsr寄存器中
MOV R0,#0XD3
msr cpsr,R0 @ USR模式中 没有特权 无法修改cpsr 

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

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

相关文章

JavaEE-SSM-订单管理-前端增删改功能实现

3.5 功能2&#xff1a;添加 从列表页面切换到添加页面 编写对应添加页面的路由 * {path: /orderAdd,name: 添加订单,component: () > import(../views/OrderAdd.vue)}编写添加功能 <template><div><table border"1"><tr><td>编…

COT元素

论文首先定义了思维链中的两种核心元素 Bridge Object: 模型解决问题所需的核心和必须元素。例如数学问题中的数字和公式&#xff0c;QA问题中的实体&#xff0c;有点类似把论文1中pattern和symbol和在了一起&#xff0c;感觉定义更清晰了 Language Template&#xff1a;除去B…

CC工具箱使用指南:【生成分级用地用海编码与名称】

一、简介 在国土空间规划中&#xff0c;用地用海分类采用三级分类体系&#xff0c;共设置24种一级类、106种二级类及39 种三级类。在某些场景中&#xff0c;需要按等级归类并汇总统计。 此工具的作用就是通过用地编码生成一至三级地类&#xff08;编码和名称&#xff09;&…

安科瑞ARTM系列-无线测温解决方案

产品简介 温度在线监测主要是针对高低压开关柜内母排搭接点&#xff0c;断路器触头、电缆接头等电气连接点的温度进行监测&#xff0c;防止在运行过程中因氧化、松动、灰尘等因素造成接点接触电阻过大而发热成为隐患&#xff0c;温度在线监测能够提升设备安全保障&#xff0c;及…

WINCC 7.5SP2安装过程

最近在群里有人问WINCC的安装问题&#xff0c;而且费了好大功夫就是安装不上&#xff0c;不管WINCC哪个版本&#xff0c;安装过程都差不多&#xff0c;于是昨天用虚拟机做了个WIN10系统&#xff0c;安装了7.5SP2版本&#xff0c;先在把安装的详细过程说一下 1、系统要求 很多…

Mistral AI社区发布SMoE混合专家模型Mixtral 8x7B性能超越ChatGPT

Mistral AI社区发布了Mixtral 8x7B混合专家模型。这是一种具有开放权重的高质量稀疏专家混合模型 (SMoE)。 根据 Apache 2.0 许可。 Mixtral 在大多数基准测试中都优于 Llama 2 70B模型,推理速度提高了 6 倍。 特别是,它在大多数标准基准测试中优于 GPT3.5。 Mixtral 8x7B混…

gitlab.rb主要配置

根据是否docker安装,进入挂载目录或安装目录 修改此文件,我一般是在可视化窗口中修改,有时候也在命令行手敲 将下面的配置复制到该文件中 external_url http://192.168.100.50 # nginx[listen_port] = 8000 (docker安装的这一行不需要,因为端口映射导致此处修改会导致访问…

2024 年全球十大远程控制软件排行榜

TrustRadius 是业界知名的软件评论网站。如果你在这里寻找远程控制软件&#xff0c;会发现 Splashtop 在最佳远程控制工具的排名第二的位置。以下我们将为大家介绍 TrustRadius 远程控制软件排名前10 的产品。 1、ConnectWise ScreenConnect ConnectWise ScreenConnect 是一种…

基于SpringBoot Vue二手闲置物品交易系统

大家好✌&#xff01;我是Dwzun。很高兴你能来阅读我&#xff0c;我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结&#xff0c;还为大家分享优质的实战项目&#xff0c;本人在Java项目开发领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#x…

为什么静态IP是您批量创建社交媒体和账户管理必备?

“新设备登录请求被拒绝&#xff0c;请使用常用设备登录。”谁没有遇到过远程管理社交或商业账户时登录被拒的情况呢? 更糟糕的情况可能是遇到这样的提示&#xff1a;“您的账号可能被盗用&#xff0c;暂时限制使用。请按要求进行身份验证。” 最坏的结果则可能是因为各种原…

(三) MySQL字符集

MySQL字符集包括 基字符集&#xff08;CHARACTER&#xff09;与校对规则&#xff08;COLLATION&#xff09;这两个概念&#xff1a; latin1支持西欧字符、希腊字符等gbk支持中文简体字符big5支持中文繁体字符utf8几乎支持世界所有国家的字符utf8mb4是真正意义上的utf-8 查看当…

换上龙年表盘,开启一整年的好运

农历新年即将到来&#xff0c;华为表盘市场陆续推出一系列龙年主题的表盘。其中&#xff0c;三款表盘的设计格外引人注目&#xff1a;云白腾龙机械、非凡腾龙多色、玄武腾龙机械。 这三款表盘不仅在艺术审美上展现了设计师的独特创意与深厚功底&#xff0c;更是在细微之处巧妙融…