【ARM扩展资料】数据寻址

文章目录

  • 【ARM扩展资料】数据寻址
    • 一、寄存器寻址
      • 1. 寄存器移位寻址
      • 2. 寄存器扩展寻址
    • 二、存储器寻址
      • 1. 寄存器间接寻址
      • 2. 带立即数偏移量的寄存器间接寻址
      • 3. 后索引寻址(Post-index)
      • 4. 前索引寻址(Pre-index)
      • 5. 带寄存器偏移量的寄存器间接寻址

一、寄存器寻址

A64指令的目的操作数采用寄存器寻址,常表达为Rd,是31个64(和32)位通用寄存器之一。大多数指令的源操作数之一也是寄存器寻址,常表达为Rn,还是是31个64(和32)位通用寄存器之一。寄存器寻址有时还可以是堆栈指针SP(WSP),或者零值寄存器XZR(WZR)。

第2个源操作数oprand2有多种寻址方式,可以是立即数寻址、寄存器寻址,在存储器访问指令中是存储器寻址。oprand2采用寄存器寻址时,常用Rm表示通用寄存器之一,还可以对Rm寄存器内容进行移位和扩展,也就是ARM处理器所特有的寄存器移位寻址和寄存器扩展寻址。

1. 寄存器移位寻址

oprand2形式是:Rm{, shift imm6}

其中,shift表示AArch64具有的4种寄存器移位操作:逻辑左移LSL(Logical Shift Left),逻辑右移LSR(Logical Shift Right),算术右移ASR(Arithmetic Shift Right),循环右移ROR(Rotate Right)。移位次数“imm6”对64位操作是0~63,而32位操作是0~31。

寄存器移位寻址主要应用于加减法指令(仅支持LSL、LSR和ASR移位)和逻辑运算指令。例如:

ADD Rd, Rn, Rm{, shift imm6} // 加法:Rd = Rn + Rm(可选移位)
SUB Rd, Rn, Rm{, shift imm6} // 减法:Rd = Rn - Rm(可选移位)

寄存器移位增强了指令功能,使得在进行加减运算的同时,还能实现移位操作。

2. 寄存器扩展寻址

oprand2形式是:Rm{, extend imm3}

其中,extend表示对寄存器Rm扩展,扩展后还可以左移0~4位(imm3)。AArch64支持的寄存器扩展操作,分成两类:

  • (1)无符号数的零位扩展:UXTB和UXTH分别把Wm的低字节和低半字数据进行零位扩展。

  • (2)有符号数的符号扩展:SXTB、SXTH和SXTW依次把Wm的低字节、低半字和字数据进行符号扩展。

寄存器扩展寻址主要应用于加减指令,可以利用寄存器扩展功能将位数较少的数据进行位扩展使两者位数相同,然后进行参与运算。例如:

ADD Rd|SP, Rn|SP, Rm{, extend imm3}  // 加法:Rd = Rn + Rm(可选扩展)
SUB Rd|SP, Rn|SP, Rm{, extend imm3}  // 减法:Rd = Rn - Rm(可选扩展)

实际上,A64指令集还有位扩展指令别名,其助记符与这里符号一样。

二、存储器寻址

A64指令不支持存储器的直接寻址,而是采用间接寻址。A64指令集的存储器地址由一个64位通用寄存器(称为基址寄存器)和可选的偏移量(立即数或者寄存器表达)组成。

1. 寄存器间接寻址

基址寄存器只是64位通用寄存器Xn或者堆栈指针SP,并加中括号表示间接寻址:

LDR Rt,[Xn|SP]    ; Rt ← [Xn|SP]

例如:

ldr w2, [x1] // 32位数据载入:w2 ← [x1]
ldr x4, [x3] // 64位数据载入:x4 ← [x3]

2. 带立即数偏移量的寄存器间接寻址

存储器地址由基址寄存器加立即数表达的偏移量组成:

LDR Rt,[Xn|SP, imm12] ; Rt ← [Xn|SP + imm12]

imm12是一个12位无符号数表达的地址偏移量,对32位指令需是0~16380之间4的倍数,对64位指令需是0~32760之间8的倍数。4或8倍数是为了对齐存储器地址:

ldr w6, [x1, 4]  // 32位数据载入:w6 ← [x1 + 4]
ldr x8, [x1, 240]    // 64位数据载入:x8 ← [x3 + 240]

3. 后索引寻址(Post-index)

后索引寻址方式的指令具有两个功能:先通过[Xn|SP]间接寻址访问存储器内容,之后将Xn|SP加上偏移量更新Xn|SP的地址:

LDR Rt,[Xn|SP], imm9  ; Rt ← [Xn|SP], Xn|SP = Xn|SP + imm9

其中,偏移量imm9是一个字节的有符号数,数据范围为-256~255。例如:

ldr x11, [x3], 8 // x11 ← [x3],x3 = x3 + 8

4. 前索引寻址(Pre-index)

前索引寻址方式的指令也具有两个功能:先将Xn|SP加上偏移量更新Xn|SP的地址,然后用[Xn|SP]间接寻址访问存储器内容:

LDR Rt,[Xn|SP, imm9]! ; Rt ← [Xn|SP + imm9], Xn|SP = Xn|SP + imm9

为了有别于立即数偏移量的寄存器间接寻址,最后要添加“!”。例如:

ldr x12, [x3, -8]!   // x12 ← [x3 - 8],x3 = x3 - 8

5. 带寄存器偏移量的寄存器间接寻址

地址偏移量保存于通用寄存器,与基址寄存器一起构成存储器地址:

LDR Rt,[Xn|SP, Wm|Xm{, extend 0|2|3}] ; Rt ← [Xn|SP + Wm|Xm(可选扩展)]

extend表示对偏移量进行移位或扩展,默认是左移LSL,对32位指令可以左移0或2位(乘4),对64位指令可以左移0或3位(乘8)。如果是32位寄存器Wm,extend需要使用UXTW零位扩展或SXTW符号扩展为64位,并支持2或3位的左移操作:

ldr x22, [x3, w5, sxtw]  // 64位载入指令:x22 ← [x3 + 符号扩展w5]
ldr x23, [x3, w5, uxtw 3]    // 64位载入指令:x23 ← [x3 + 零位扩展w5×8]

【汇编语言】【ARM扩展资料】数据寻址相关推荐

  1. 【汇编语言】【ARM扩展资料】数据表示

    [ARM扩展资料]数据表示 文章目录 [ARM扩展资料]数据表示 一.常量表达 1.常数 2.字符和字符串 3.符号常量 4.数值表达式 二.指示符 1.区段定义指示符 2.标号属性指示符 3.数据定 ...

  2. 【汇编语言】【ARM扩展资料】汇编语言开发

    [ARM扩展资料]汇编语言开发 文章目录 [ARM扩展资料]汇编语言开发 一.指令格式 1.典型的A64指令格式 2.加减法的简单指令示例: 二.语句格式 1.汇编语言语句的通用格式: 三.显示程序 ...

  3. 【汇编语言】【ARM扩展资料】硬件组成

    [ARM扩展资料]硬件组成 文章目录 [ARM扩展资料]硬件组成 一.ARM处理器 1. ARM体系结构 2. Cortex系列处理器 3. ARMv8-A处理器 二.结构基础 1. 异常 2. 执行 ...

  4. 用Apache Ignite实现可扩展的数据网格

    在本文中,我们将先介绍数据网格(Data Grid)的基本概念.属性.以及能够提供的服务,然后讨论如何设计可扩展的数据网格,以满足实际场景的业务需求. 什么是数据网格? 数据网格是一组能够提供共享数据 ...

  5. 指令系统寻址方式——指令寻址,数据寻址

    前言 寻址方式是指确定本条指令的数据地址以及下一条将要执行的指令地址的方法,它与硬件结构紧密相关,而且直接影响指令格式和指令功能. 一.寻址方式的分类 寻址方式分为:指令寻址和数据寻址两大类. 指令寻 ...

  6. 指令系统——数据寻址(1)(详解)

    一.总览 二.操作数类型与寻址方式 三.数据寻址 四.立即寻址 立即寻址:形式地址A就是操作数本身,又称为立即数,一般采用补码形式.#表示立即寻址特征. 一条指令的执行:取指令访存1次,执行指令访存0 ...

  7. 计算机误删怎么恢复数据,电脑资料数据误删怎么恢复?

    原标题:电脑资料数据误删怎么恢复? 电脑上的资料误删怎么恢复?电脑是我们办公学习必备的工具,平时存储在电脑上的资料都是工作中或者学习中的重要资料.这些重要的资料在电脑上被自己误删了该怎么恢复?很多人都 ...

  8. 华为在俄罗斯开设基于ARM技术的数据中心:技术之外,环境使然?

    数据智能产业创新服务媒体 --聚焦数智 · 改变商业 近日,据俄罗斯媒体CNnews报道,华为在俄罗斯建立了第一个基于ARM技术的数据中心,该数据中心由华为智能计算系统部门建造,是俄罗斯建设的首个此类 ...

  9. S4 HANA BP-客商共用编码处理(示例:已存在的供应商编码扩展客户数据)

    BP经常遇到 客户和供应商使用相同编码情况,以已存在的供应商编码扩展客户数据为例 DATA: CS_BPDATA TYPE CVIS_EI_EXTERN.cs_bpdata-partner-heade ...

最新文章

  1. 基于vue-cli,做个nuxt脚手架~
  2. 【arduino】arduino ISP下载程序方法,用arduino uno给M5 Module DC MOTOR下载程序
  3. asp.net 字符串过滤
  4. 正则表达式 学习笔记3.4
  5. arcgis两点之间连线_使用ArcGIS制作城市关系强度图(附数据下载)
  6. commons.pool2 对象池的使用
  7. word敲空格文字不后退_聊聊Word中的几种缩进(中)
  8. android之Uniapp之Weex之module开发
  9. 2018-2019-2 20175223 实验五 《网络编程与安全》实验报告
  10. 如何删除后缀.Tater勒索病毒并解密.tater勒索病毒加密的病毒文件
  11. 合成孔径雷达成像——算法与实现图【2.3】仿真——rect函数、sinc函数的傅里叶变换matlab仿真
  12. taptap(fake)
  13. MPAndroidChart 3.0——BarChart(一)
  14. java 掩码 iP与位数的转化
  15. 使用 HTML、CSS 和 JS 创建在线音乐播放器(含免费完整源码)
  16. 享元模式——滴滴打车的共享经济思维
  17. android系统最近删除照片,安卓手机最近删除的照片怎么恢复?专家教你这样做...
  18. Cadence Allegro PCB设计88问解析(四) 之 Allegro中快捷键Funckey与alias设置
  19. 什么是元数据?为何需要元数据?
  20. Eclipse中文语言包下载后怎么使用

热门文章

  1. 推荐一个CSLab------英真时代(非广告,真心的)
  2. java 整数加减乘除_java实现超大整数加减乘除四则运算
  3. quarts集群 运维_Quartz.Net分布式运用
  4. ad软件中的插座_STM32采集AD的输入阻抗问题(转)
  5. ROS保姆级0基础入门教程⭐ |第一章 ROS的概述与环境搭建(4万字教程,建议收藏)
  6. rstudio 修改代码间距_如何在RStudio里修改R脚本的编码方式
  7. java adf是什么_在ArcIMS9.2中使用JAVA ADF实现图层要素的查询
  8. bazel 链接第三方动态库_C/C++编程知识:Linux 动态库相关知识整理
  9. 投色子抽奖游戏 html,jQuery实现简单的抽奖游戏
  10. 怎么提前体验鸿蒙,鸿蒙OS手机版明天发布,开发者提前体验,上手操作毫无难度...