ARMV8 - A64 - 存储器读写指令

说明

  • 存储器读写指令是用来读写内存/SRAM/外设寄存器等存储器的汇编指令。
  • ARM指令集属于RISC指令集,RISC指令集采用典型的加载/存储体系结构,CPU无法对内存里的数据直接操作,只能通过Load/Store指令来实现,当我们需要对内存中的数据进行操作时,要首先将这个数据从内存加载到寄存器,然后在寄存器中对数据进行处理,再将结果重新存储到内存中,如下:
  • Load/Store 示例:
char c = 6;
* 对应的汇编代码
mov w0, 6    //先将6保存到通用寄存器w0中
strb    w0, [sp, 31] //再将w0数据store到内存栈([sp, 31])中。int c = a + b;
* 对应汇编代码
ldr w1, [sp, 12] //从栈上将a load到通用寄存器w1
ldr w0, [sp, 8] //从栈上将b load到通用寄存器w0
add w0, w1, w0  //将寄存器w0和w1中的数据相加,在保存到w0
str w0, [sp, 28] //将w0中的数据保存到栈上

对应汇编指令

  • aarch64通过str系列指令实现:将寄存器中的数据保存(store)到内存中,以及通过ldr系列指令实现:将内存中数据读取(load)到寄存器中。

数据类型

  • 与高级编程语言类似,ARM汇编支持load/store不同的数据类型,可以是有符号或无符号的字、半字或字节, 对应的汇编指令如下:
ldr = Load Word
ldrh = Load unsigned Half Word
ldrsh = Load signed Half Word
ldrb = Load unsigned Byte
ldrsb = Load signed Bytesstr = Store Word
strh = Store unsigned Half Word
strsh = Store signed Half Word
strb = Store unsigned Byte
strsb = Store signed Byte
  • 默认(ldr/str)支持无符号的word(4字节)或者8字节,带h表示支持半字(2字节),带b表示支持1个字节,带s表示有符号,

str(store register)/ldr(load register)系列指令

  1. str/ldr指令
  • 操作对象:一个寄存器,操作数据size:和使用的寄存器相关。
str x0, [sp] //将通用寄存器x0中的值(64bits)存储到栈顶指针sp指向的存储地址
str w0, [sp] //将通用寄存器w0中的值(32bits)存储到栈顶指针sp指向的存储地址
ldr x0, [sp, 8] //将栈顶指针sp+8指向地址的数据保存到通用寄存器x0中(64bits)
ldr w0, [sp, 8] //将栈顶指针sp+8指向地址的数据保存到通用寄存器w0中(32bits)
  1. stp/ldp指令
  • 能够同时操作两个寄存器,p表示pair,数据size和str指令一致,常用来做出入栈操作。
stp x29, x30, [sp, -16]!//将通用寄存器x29和x30的值存储到栈顶指针sp和sp+64指向的存储地址
ldp x29, x30, [sp], 16 //将栈顶指针sp和sp+64指向地址的数据分别保存到通用寄存器x29和x30中
  1. strb/ldrb指令
  • 操作对象:一个寄存器,操作数据size:一个字节(8位)。
strb w0, [sp, 31] //将通用寄存器w0的低8位的字节数据存储到sp+31指向的存储地址
ldrb w1, [sp, 31] //将栈顶指针sp+31指向地址的数据保存到通用寄存器w1的低8位,w1的高24位会被清零
  1. strh/ldrh指令
  • 操作对象:一个寄存器,操作数据size:两个字节(16位)。
strh w0, [sp, 30] //将通用寄存器w0的低16位的两个字节数据存储到sp+30指向的存储地址
ldrh w1, [sp, 31] //将栈顶指针sp+31指向地址的数据保存到通用寄存器w1的低16位,w1的高16位会被清零
  1. stur/ldur指令
  • 功能和str/ldr一样, 但是stur/ldur后面的立即数通常是负数。
ldur x1,[x0,#-1] //负数立即数
ldr x1,[x0,#1]   //正数立即数

伪指令

  • ldr既是一个汇编指令,也是一个伪指令的助记符,作为伪指令,其用于加载一个立即数或地址值到寄存器。
  • 语法
LDR{condition} register,=[expression | label-expression]

汇编指令/伪指令区分

  • 使用"[]“的是指令,使用”="的是伪指令,如下:
ldr x0, [sp, 8]  //汇编指令
ldr x4, =0x04140000 //伪指令,将地址0x04140000 保存(load)到x4中。

和mov指令区别

  • 伪指令ldr作用和mov指令比较类似,但是有些立即数,mov指令无法支持,如果mov能表示,替换成mov指令也是可以。

变址寻址方式

  • 使用str/ldr系列指令,有三种变址情况
  1. 自身不变化
ldr x5, [x6, #0x8]  //等同于 *x5 = *(x6 + 0x8),x6中的数据不变化
  1. 返回后变化
ldr x5, [x6], #0x8  //等同于 *x5 = *x6, x6 += 0x8,将x6指向地址的数据保存到x5,x6中的地址数据偏移8字节(+8)
  1. 返回前变化
ldr x5, [x6, #0x8]! //等同于 x6 += 0x8,*x5 = *x6,先将x6中的地址数据偏移8字节(+8),再取出其指向的数据到x5中

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

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

相关文章

视界臻色彩 轻巧薄未来 《2023年中国OLED电视发展白皮书》发布

随着中国经济迈入新周期,彩电行业也进入存量竞争阶段。在此背景下,主流品牌围绕新产品、新技术、新应用等方面积极发力,特别是在高端彩电市场的争夺中,伴随着三星OLED的入局开始变得愈发激烈。我国“十三五”规划中明确指出&#…

MySQL高级--01_1--数据库缓冲池(buffer pool)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 数据库缓冲池(buffer pool)DBMS 会申请占用内存来作为数据缓冲池,在真正访问页面之前,需要把在磁盘上的页缓存到内存中的Buffer Pool 之后才…

2024年网络安全比赛--系统渗透测试(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 1.在渗透机中对服务器主机进行信息收集,将服务器开启的端口号作为 Flag 值提交; 2.在渗透机中对服务器主机进行渗透,在服务器主机中获取服务器主机名称&#xff…

MX6ULL学习笔记 (八) platform 设备驱动实验

前言: 什么是 Linux 下的 platform 设备驱动 Linux下的字符设备驱动一般都比较简单,只是对IO进行简单的读写操作。但是I2C、SPI、LCD、USB等外设的驱动就比较复杂了,需要考虑到驱动的可重用性,以避免内核中存在大量重复代码&…

全志XR806蓝牙透传(单向)测试

评测三 蓝牙透传(单向) 有时无线透传在无法布线时有很方便的效用,不妨试试蓝牙透传,效果如下: 具体是无线数据->串口数据,串口数据->无线数据,目前前者实现了,后者还有些问题未解决, 实现…

支持生成接口文档!Apipost IDEA插件使用体验

前言 Idea 是一款功能强大的集成开发环境(IDE),它可以帮助开发人员更加高效地编写、调试和部署软件应用程序,Idea 还具有许多插件和扩展,可以根据开发人员的需要进行定制和扩展,从而提高开发效率,今天我们就来介绍一款…

持续集成交付CICD:Sonarqube多分支代码扫描

目录 一、实验 1.Sonarqube安装插件 2.Sonarqube多分支代码扫描 一、实验 1.Sonarqube安装插件 (1)不同软件版本对应不同插件版本 (2)插件对应版本下载安装 将下载好的插件包(sonarqube-community-branch-plugin…

三层交换机配置DHCP服务

第一步:进入二层交换机Switch 1)输入命令: Switch(config)#vlan 10 Switch(config)#vlan 20 2)修改F0/1 和F0/2为access口,F0/24为trunk口 第二步:进入三层交换机 1)输入命令 Switch(config)#…

每日一练2023.12.7—— 情人节【PTA】

题目链接:L1-035 情人节 题目要求: 以上是朋友圈中一奇葩贴:“2月14情人节了,我决定造福大家。第2个赞和第14个赞的,我介绍你俩认识…………咱三吃饭…你俩请…”。现给出此贴下点赞的朋友名单,请你找出…

深入理解HTTPS加密协议

在现代网络环境中,数据安全和隐私保护至关重要。HTTPS(全称为HyperText Transfer Protocol Secure)是一种用于保障互联网通信安全的加密协议,它通过在HTTP协议的基础上添加SSL/TLS层来实现对数据的加密传输。本文将详细介绍HTTPS的…

axios创建实例对象,发送ajax请求,配置baseUrl

axios创建实例对象,发送ajax请求,配置baseUrl // 创建实例对象 import axios from axiosconst duanzi axios.create({baseURL: https://172.11.11.11:1010,timeout: 2000});duanzi({url: /api-getJoke/testIndex,method: post,responseType: blob,data…

PPT设置章节

0 Preface/Foreward 1 添加章节方法 选择 > 开始 > 节 可以进行: 新增节重命名节删除所有节 相关节的内容如下:

antd 表单各种验证

表单中需要很多验证&#xff0c;有时某项不是必须项&#xff0c;但是如果填写的必须遵守某种规则&#xff0c;所以就总结一下&#xff0c;比如手机号不是必须项&#xff0c;但是如果填写了必须遵守正则规则&#xff1a; <a-formlayout"horizontal":form"form…

超大规模集成电路设计----FPGA时序模型及FSM的设计(八)

本文仅供学习&#xff0c;不作任何商业用途&#xff0c;严禁转载。绝大部分资料来自----数字集成电路——电路、系统与设计(第二版)及中国科学院段成华教授PPT 超大规模集成电路设计----RTL级设计之FSM&#xff08;八&#xff09; 7.1 CPLD的时序模型7.1.1 XPLA3 时序模型7.1.…

maven篇---第三篇

系列文章目录 文章目录 系列文章目录前言一、如何解决依赖传递引起的版本冲突?二、说说maven的依赖原则三、说说依赖的解析机制?四、说说插件的解析机制前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男…

UVa1339古老的密码题解

题目 给你两个字符串&#xff0c;看你能不能将第一个字符变化位置&#xff08;重排&#xff09;&#xff0c;变成和第二个字符串的26个字母一一对应。 解题思路&#xff1a;将两个字符串的各个字符的数量统计出来&#xff0c;如果各个字符串的数量都是一样的&#xff0c;那么就…

postgresql从入门到精通 - 第37讲:postgres物理备份和恢复概述

PostgreSQL从小白到专家&#xff0c;是从入门逐渐能力提升的一个系列教程&#xff0c;内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容&#xff0c;希望对热爱PG、学习PG的同学们有帮助&#xff0c;欢迎持续关注CUUG PG技术大讲堂。 第37讲&#…

麒麟信安系统下的硬盘分区情况说明

目前飞腾平台上面麒麟信安系统分区情况如下&#xff1a; Tmpfs为内存文件系统&#xff0c;可以不考虑&#xff0c;真正使用的是两个分区 两个分区加起来为51G 查看cat /etc/fstab可以看到/data这个分区下包含了home opt root等常用文件夹 再加上这个分区容量只有17G&#xff0c…

关于kotlin的属性委托,报错的,实际原因剖析

报错&#xff1a;Property delegate must have a ‘getValue(SecurityCheckView, KProperty*>)’ method. None of the following functions are suitable 解决方案&#xff1a;就是在根目录的build.gradle中改变 kotlin的插件版本 classpath “org.jetbrains.kotlin:kotli…

TCP单聊和UDP群聊

TCP协议单聊 服务端&#xff1a; import java.awt.BorderLayout; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.V…