ARMV8 - A64 - 存储器读写指令

2023-12-07 18:04

本文主要是介绍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中

这篇关于ARMV8 - A64 - 存储器读写指令的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/466842

相关文章

Java实现远程执行Shell指令

《Java实现远程执行Shell指令》文章介绍使用JSch在SpringBoot项目中实现远程Shell操作,涵盖环境配置、依赖引入及工具类编写,详解分号和双与号执行多指令的区别... 目录软硬件环境说明编写执行Shell指令的工具类总结jsch(Java Secure Channel)是SSH2的一个纯J

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

MySQL中读写分离方案对比分析与选型建议

《MySQL中读写分离方案对比分析与选型建议》MySQL读写分离是提升数据库可用性和性能的常见手段,本文将围绕现实生产环境中常见的几种读写分离模式进行系统对比,希望对大家有所帮助... 目录一、问题背景介绍二、多种解决方案对比2.1 原生mysql主从复制2.2 Proxy层中间件:ProxySQL2.3

C#读写文本文件的多种方式详解

《C#读写文本文件的多种方式详解》这篇文章主要为大家详细介绍了C#中各种常用的文件读写方式,包括文本文件,二进制文件、CSV文件、JSON文件等,有需要的小伙伴可以参考一下... 目录一、文本文件读写1. 使用 File 类的静态方法2. 使用 StreamReader 和 StreamWriter二、二进

MySQL主从复制与读写分离的用法解读

《MySQL主从复制与读写分离的用法解读》:本文主要介绍MySQL主从复制与读写分离的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、主从复制mysql主从复制原理实验案例二、读写分离实验案例安装并配置mycat 软件设置mycat读写分离验证mycat读

Redis分片集群、数据读写规则问题小结

《Redis分片集群、数据读写规则问题小结》本文介绍了Redis分片集群的原理,通过数据分片和哈希槽机制解决单机内存限制与写瓶颈问题,实现分布式存储和高并发处理,但存在通信开销大、维护复杂及对事务支持... 目录一、分片集群解android决的问题二、分片集群图解 分片集群特征如何解决的上述问题?(与哨兵模

Python包管理工具核心指令uvx举例详细解析

《Python包管理工具核心指令uvx举例详细解析》:本文主要介绍Python包管理工具核心指令uvx的相关资料,uvx是uv工具链中用于临时运行Python命令行工具的高效执行器,依托Rust实... 目录一、uvx 的定位与核心功能二、uvx 的典型应用场景三、uvx 与传统工具对比四、uvx 的技术实

ShardingSphere之读写分离方式

《ShardingSphere之读写分离方式》:本文主要介绍ShardingSphere之读写分离方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录ShardingSphere-读写分离读写分离mysql主从集群创建 user 表主节点执行见表语句项目代码读写分

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Nginx指令add_header和proxy_set_header的区别及说明

《Nginx指令add_header和proxy_set_header的区别及说明》:本文主要介绍Nginx指令add_header和proxy_set_header的区别及说明,具有很好的参考价... 目录Nginx指令add_header和proxy_set_header区别如何理解反向代理?proxy