ARM寻址方式

目录

前言

一、寻址方式是什么?

二、九种寻址方式

1.立即寻址

2.寄存器寻址

3.寄存器位移寻址(ARM集特有)

4.寄存器间接寻址

5.基址寻址

6.相对寻址

7.多寄存器寻址

8.堆栈寻址

9.块拷贝寻址

多寄存器传送指令映射汇总

总结



前言

ARM(Advanced RISC Machine)架构是一种精简指令集计算机(RISC)架构,它在移动设备、嵌入式系统和许多其他领域中具有重要的地位。ARM架构由于其低功耗、高性能和灵活性,在移动设备、嵌入式系统、物联网和云计算等领域具有重要的地位。

本文就介绍了ARM寻址方式的重要内容。


一、寻址方式是什么?

寻址方式(Addressing modes)是指计算机处理器在执行指令时,如何确定数据的存储位置的方法。不同的寻址方式允许程序访问内存中的数据,并将其用于运算或其他操作。不同的处理器架构和指令集支持不同的寻址方式。选择合适的寻址方式可以使程序更加高效地访问和操作数据。

二、九种寻址方式

1.立即寻址

  • 将操作数直接编码在指令中,而不是通过地址寻址
  • 操作数被视为一个立即数,可以是一个常数、一个变量或一个表达式
  • 优点:速度快、简单直接,可以减少内存访问的开销
  • 缺点:操作数的大小受到指令长度的限制,只能处理较小的操作数

ADD R1,#10;操作数10被编码在指令中,ADD指令将10加到R1寄存器中

2.寄存器寻址

  • 操作数存储在寄存器中,指令直接引用这些寄存器来执行操作
  • 优点:速度快,因为操作数直接存储在寄存器中,不需要额外的内存访问。寄存器通常比内存访问更快。
  • 缺点:寄存器的数量有限,寄存器寻址可能受到寄存器数量的限制

ADD R1, R2, R3;ADD指令将寄存器R2和R3的数相加,并将结果存储到寄存器R1中

3.寄存器位移寻址(ARM集特有)

  • 使用一个寄存器中的地址作为基地址,再加上一个固定的偏移量来访问内存中的操作数
  • 优点:可以通过寄存器来动态计算内存地址,从而实现更灵活的内存访问

 指令总结:

  • LSL:逻辑左移
  • LSR:逻辑右移
  • ASR:算术右移
  • ROR:循环右移
  • RRX;扩展为1的循环右移

LOAD R1, (R2, #10);LOAD指令从地址为R2加上偏移量10的内存位置中读取操作数,并将其加载到寄存器R1中

4.寄存器间接寻址

  • 使用寄存器中的值作为地址来访问内存中的数据。
  • 优点:灵活性和可移植性
  • 缺点:性能开销和可读性

LOAD R2, (R1);LOAD指令从地址R1中存储的地址中读取数据,并将其加载到寄存器R2中。

5.基址寻址

  • 将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址
  • 优点:灵活性、保护性和可移植性
  • 缺点:引入额外指令和增加程序的复杂性

LDR R2,[R3,#0x0C];读取R3+0x0C地址上的存储单元的内容,放入R2

STR R1,[R0,#-4]!;先R0=R0-4,然后把R1的值寄存到保存到R0指定的存储单元

6.相对寻址

  • 由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。
  • 优点:灵活且安全的方式来描述地址位置关系
  • 缺点:计算复杂度、可读性和精度问题

7.多寄存器寻址

  • 一次可传送几个寄存器值,允许一条指令传送16个寄存器的任何子集或所有寄存器
  • 优点:灵活性、高效性和可读性
  • 缺点:引入额外的复杂性

LDMIA R1!,{R2-R7,R12};将R1指向的单元中的数据读出到R2~R7、R12中(R1自动加4)

STMIA R0!,{R2-R7,R12};将寄存器R2~R7、R12的值保存到R0指向的存储单元中

8.堆栈寻址

  • 使用一个专门的寄存器指向一块存储区域,指针所指向的存储单元即是堆栈的栈顶
  • 操作顺序为“后进先出”
  • 满堆栈和空堆栈

 堆栈方式

  • 满递增:指令如LDMFA、STMFA等
  • 空递增:指令如LDMEA、STMEA等
  • 满递减:指令如LDMFD、STMFD等
  • 空递减:指令如LDMED、STMED等

记忆理解方式:

  • STM:CPU→存储器,存数据
    • 若是满栈(F),则先移地址,后存数据;若是空栈(E),则先存数据,后移地址
    • 若是递增(A),则地址递增的存数据;若是递减(D),则地址递减的存数据;同时,“小”放“小”,“大”放“大”
  • LDM:存储器→ CPU,取数据
    • 若是满栈(F),则先取数据,后移地址;若是空栈(E),则先移地址,后取数据
    • 若是递增(A),则地址递减的存数据;若是递减(D),则地址递增的存数据(和存数据时的方向相反);“小”放“小”,“大”放“大”

举例: 0X40000000开始存放连续的字数据(4个字节)SP=0X40000010,{R0-R3}={0XAA,0XBB,0XCC,0XDD}

  • STMFA R13!, {R0-R3}
  • 分析过程:STM为CPU→存储器,存数据;"F"为满,则先动地址,后存数据,顺序为递增
  • 结论:
    • 0X40000014 0XAA
    • 0X40000018 0XBB
    • 0X4000001C 0XCC
    • 0X40000020 0XDD
  • LDMFA R13!, {R0-R3}
  • 分析过程:LDM为存储器→ CPU,取数据;"F"为满,则先取数据,后动地址,顺序为递减(和存数据相反)
  • 结论
    • R0={0X22}
    • R1={0X33}
    • R2={0X44}
    • R3={0X55}

9.块拷贝寻址

  • 使用两个指针,分别指向源数据块和目标数据块,然后通过移动这两个指针来逐个复制数据块中的元素
  • 通常用于实现内存拷贝、数组复制等操作
  • 优点:灵活且高效的方式来处理数据块拷贝操作
  • 缺点:复杂性、易错性以及可读性

 记忆理解方式:

  • 地址增加在先(IB):STMIB,LDMIB
  • 地址增加在后(IA):STMIA,LDMIA
  • 地址减少在先(DB):STMDB,LDMDB
  • 地址减少在后(DA):STMDA,LDMDA

举例:0 X40000000开始存放连续的字数据(4个字节),SP=0X40000010,R1=0X40000010,{R5-R7}={0XAA,0XBB,0XCC}

  • STMIB R1!, {R5-r7}
  • 分析过程:地址增加在先
  • 结论:
    • 0X40000014 0XAA
    • 0X40000018 0XBB
    • 0X4000001C 0XCC
  • LDMDA R1!, {R5-r7}
  • 分析过程:地址减少在先
  • 结论
    • R5={0X33}
    • R6={0X44}
    • R7={0X55}

多寄存器传送指令映射汇总


总结

以上就是今天要讲的内容,本文主要介绍了ARM的九种寻址方式以及分析方法,希望对大家学习ARM有所帮助。祝您在学习的道路上前行顺利,收获满满的成就!

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值