目录
前言
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有所帮助。祝您在学习的道路上前行顺利,收获满满的成就!