【ARM】常用寻址方式

简介: 通常数据处理指令的格式如下所示:<opcode>{<cond>}{S} <Rd>,<Rn>,<shifter_operand>其中:<opcode> 是指令助记符,如ADD表示算术加操作指令。{<cond>} 表示指令执行的条件。{S} 决定指令的操作是否影响CPSR的值。<Rd> 表示目标寄存器。<Rn> 表示包含第1个操作数的寄存器。<shifter_operand> 表示第2个操作数。其有以下三种格式
  • 2.2 ARM指令寻址方式

2.2 ARM指令寻址方式


  1. 数据处理指令的操作数的寻址方式。
  2. 字及无符号字节的Load/Store指令的寻址方式。
  3. 杂类Load/Store指令的寻址方式。
  4. 批量Load/Store指令的寻址方式。
  5. 协处理器Load/Store指令的寻址方式。

通常数据处理指令的格式如下所示:<opcode>{<cond>}{S} <Rd>,<Rn>,<shifter_operand>其中:<opcode> 是指令助记符,如ADD表示算术加操作指令。{<cond>} 表示指令执行的条件。{S} 决定指令的操作是否影响CPSR的值。<Rd> 表示目标寄存器。<Rn> 表示包含第1个操作数的寄存器。<shifter_operand> 表示第2个操作数。其有以下三种格式

  1. 立即数方式
  2. 寄存器方式
  3. 寄存器移位方式

- ASR 算术右移

- LSL 逻辑左移

- LSR 逻辑右移

- ROR 循环右移

- RRX 扩展的循环右移


2.2.1 数据处理指令的操作数的寻址方式


数据处理指令操作数的具体寻址方式有下面11种。

  1. #<immediate>

例:MOV R0,#0X10;将立即数0x10给R0

  1. <Rm>

例:MOV R0,R1;将R1的值放到R0

  1. <Rm>,LSL #<shift_imm>

例:MOV R0,R0,LSL #1;R0=R0*(2**1)

  1. <Rm>,LSL <Rs>

例:MOV R0,R0,LSL R1;R0=R0左移R1位后的值

  1. <Rm>,LSR #<shift_imm>

例:MOV R0,R0,LSL #1;R0=R0/(2**1)

  1. <Rm>,LS1R <Rs>

例:MOV R0,R0,LSL R1;R0=R0右移R1位后的值

  1. <Rm>,ASR #<shift_imm>
  2. <Rm>,ASR <Rs>
  3. <Rm>,ROR #<shift_imm>
  4. <Rm>,ROR <Rs>
  5. <Rm>,RRX

2.2.2 字及无符号字节的Load/Store指令的 寻址方式


种类型的Load/Store指令的寻址方式由两部分组成。一部分为一个的基址寄存器;另一部分为一个地址偏移量。

基址寄存器可以为任一个通用寄存器;地址偏移量可以有以下3种格式。立即数 寄存器 寄存器及一个移位常数同样,寻址方式的地址计算方法有如下3种:偏移量方法 事先更新方法 事后更新方法LDR指令的语法格式如下所示:LDR{<cond>}{B} {T}<Rd>,<address_mode> 其中,<address_mode>表示第2个操作数的内存地址,共有如下9种格式:

1.立即数+偏

  • [<Rn>,#+/–<offset_12>]

例:LDR R0,[R0,#4];将内存单元R0+4中的字读取到R0中

2.寄存器+偏

  • [<Rn>,+/–<Rm>]

例:LDR R0,[R0,R1];将内存单元R0+R1中的字读取到R0中

3.寄存器+移位+偏

  • [<Rn>,+/–<Rm><shift>#<shift_imm>]

LDR R0 [R0,R1,LSL #1];将内存单元R0+R1*(2**1)中的数据读取到R0中

4.立即数+偏+事先访问

  • [<Rn>,#+/–<offset_12>]!

例:LDR R0,[R0,#4];将内存单元R0+4中的字读取到R0中,同时R0=R0+4

5.寄存器+偏+事先访问

  • [<Rn>,+/–<Rm>]!

例:LDR R0,[R0,R1];将内存单元R0+R1中的字读取到R0中,同时R0=R0+R1

  1. 寄存器+移位+事先访问
  • [<Rn>,+/–<Rm><shift>#<shift_imm>]!

LDR R0 [R0,R1,LSL #1];将内存单元R0+R1*(2**1)中的数据读取到R0中,同时R0=R0+R1*(2**1)

  1. 立即数+事后访问
  • [<Rn>],#+/–<offset_12>

LDR R0,[R1],#4;将内存单元R1中的数据读取到R0中,然后R0=R1+4

  1. 寄存器+事后访问
  • [<Rn>],+/–<Rm>

LDR R0,[R1],R2;将内存单元R1中的数据读取到R0中,然后R0=R1+R2

9.寄存器+移位+事先访问

  • [<Rn>],+/–<Rm><shift>#<shift_imm>

LDR R0,[R1],R2,LSL #2;将内存单元R1中的数据读取到R0中,然后R0=R1+R2*(2**2)


2.2.3 杂类Load/Store指令的寻址方式


杂类Load/Store指令包括:

  1. 操作数为半字(无符号数或带符号数)数据的Load/Store指令;
  2. 操作数为带符号的字节数据的Load 指令;双字的Load/Store指令。这类指令的语法格式为: LDR|STR{<cond>}H|SH|SB|D <Rd>,<addressing_mode>其中,<addressing_mode>是指令中内存单元的寻址方式,具体有以下6种格式:
  1. 立即数+偏
  • [<Rn>,#+/–<offset_8>]

LDRSB R0,[R1,#4];将内存单元R1+4中的有符号字节数据读取到R0寄存器中;R0中高24位设置成该字节数据的符号位

  1. 寄存器+偏
  • [<Rn>,+/–<Rm>]

STRH R0,[R1,R2];将R0中低16位数据保存内存单元(R1+R2)中

  1. 寄存器+移位+事先访问
  • [<Rn>,#+/–<offset_8>]!

LDRSH R0,[R1,#4]!;将内存单元(R1+4)中字节数据读取到R0中;R0中高16位设置成该半字节的符号位,同时R1=R1+4

  1. 寄存器+事先访问
  • [<Rn>,+/–<Rm>]!

LDRH R0,[R1,R2]!;将内存单元(R1+R2)中的半字数据读取到R0中;R0中高16位设置成0,同时R0=R1+R2

  1. 寄存器+移位+事后
  • [<Rn>],#+/–<offset_8>

STRH R0,[R1],#4;将R0中低16位数据保存到内存单元R1中,然后(指令执行完后)R0=R1+4

  1. 寄存器+事后
  • [<Rn>],+/–<Rm>

STRH R0,[R1],R2;将R0中低16位数据保存到内存单元R1中,然后(指令执行完后)R1=R1+R2


2.2.4 批量Load/Store指令的寻址方式


一条批量Load/Store指令可以实现在一组寄存器和一块连续的内存单元之间传输数据。其语法格式如下: DM|STM{<cond>}<addressing_mode> <Rn>{!}, <registers>{^} <addressing_mode>表示地址的变化方式,有以下4种方式。IA (Increment After) 事后递增方式IB (Increment Before) 事先递增方式DA (Decrement After) 事后递减方式DB (Decrement Before) 事先递减方式


2.2.5 协处理器Load/Store指令的寻址方式


一条协处理器Load/Store指令可以在ARM处理器和协处理器之间传输批量数据。其语法格式如下: <opcode>{<cond>}{L} <coproc>,<CRd>,<addressing_mode>其中,<addressing_mode>表示地址的变化方式,有以下4种格式:[<Rn>,#+/–<offset_8>4][<Rn>,#+/–<offset_8>4]![<Rn>],#+/–<offset_8>*4[<Rn>],<option>

相关文章
|
7月前
|
存储
ARM 堆栈寻址类型区分
该文介绍了堆栈的两种指向分类:向上生成型(递增堆栈)和向下生成型(递减堆栈),以及堆栈的两种数据状态:满堆栈(指针指向最后数据)和空堆栈(指针指向存放数据的位置)。满递增和满递减是在完整数据单元上操作,而空递增和空递减则允许自定义步长。文中通过图示说明了不同情况下的堆栈存储方式。
86 3
|
13天前
|
机器学习/深度学习 弹性计算 人工智能
阿里云服务器架构有啥区别?X86计算、Arm、GPU异构、裸金属和高性能计算对比
阿里云ECS涵盖x86、ARM、GPU/FPGA/ASIC、弹性裸金属及高性能计算等多种架构。x86架构采用Intel/AMD处理器,适用于广泛企业级应用;ARM架构低功耗,适合容器与微服务;GPU/FPGA/ASIC专为AI、图形处理设计;弹性裸金属提供物理机性能;高性能计算则针对大规模并行计算优化。
|
2月前
|
编解码 弹性计算 应用服务中间件
阿里云服务器Arm计算架构解析:Arm计算架构云服务器租用收费标准价格参考
阿里云服务器架构分为X86计算、Arm计算、高性能计算等多种架构,其中Arm计算架构以其低功耗、高效率的特点受到广泛关注。本文将深入解析阿里云Arm计算架构云服务器的技术特点、适用场景以及包年包月与按量付费的收费标准与最新活动价格情况,以供选择参考。
|
2月前
|
机器学习/深度学习 弹性计算 编解码
阿里云服务器计算架构X86/ARM/GPU/FPGA/ASIC/裸金属/超级计算集群有啥区别?
阿里云服务器ECS提供了多种计算架构,包括X86、ARM、GPU/FPGA/ASIC、弹性裸金属服务器及超级计算集群。X86架构常见且通用,适合大多数应用场景;ARM架构具备低功耗优势,适用于长期运行环境;GPU/FPGA/ASIC则针对深度学习、科学计算、视频处理等高性能需求;弹性裸金属服务器与超级计算集群则分别提供物理机级别的性能和高速RDMA互联,满足高性能计算和大规模训练需求。
|
2月前
|
存储 Docker 容器
ARM架构鲲鹏主机BClinux离线安装docker步骤
下载并安装适用于ARM架构的Docker CE二进制文件,解压后移动至/usr/bin目录。创建docker组,配置systemd服务脚本(docker.service、docker.socket、containerd.service),重载systemd配置,启动并启用docker服务。编辑daemon.json配置存储驱动、镜像加速地址等,最后拉取所需镜像。
57 0
|
2月前
|
NoSQL MongoDB Docker
求助,有没有大神可以找到arm64架构下mongodb的3.6.8版本的docker镜像?
在Docker Hub受限的情况下,寻求适用于ARM架构的docker镜像资源或拉取链接,以便在x86架构上获取;内网中的机器为ARM架构,因此优先请求适合ARM的Docker镜像或Dockerfile,非常感激您的帮助。
|
4月前
|
编解码 安全 Linux
基于arm64架构国产操作系统|Linux下的RTMP|RTSP低延时直播播放器开发探究
这段内容讲述了国产操作系统背景下,大牛直播SDK针对国产操作系统与Linux平台发布的RTMP/RTSP直播播放SDK。此SDK支持arm64架构,基于X协议输出视频,采用PulseAudio和Alsa Lib处理音频,具备实时静音、快照、缓冲时间设定等功能,并支持H.265编码格式。此外,提供了示例代码展示如何实现多实例播放器的创建与管理,包括窗口布局调整、事件监听、视频分辨率变化和实时快照回调等关键功能。这一技术实现有助于提高直播服务的稳定性和响应速度,适应国产操作系统在各行业中的应用需求。
123 3
|
3月前
ARM64架构提供的Cache操作
ARM64架构提供的Cache操作