首页 > 其他分享 >嵌入式:ARM间接寻址、变址寻址与多寄存器寻址

嵌入式:ARM间接寻址、变址寻址与多寄存器寻址

时间:2022-12-18 20:10:04浏览次数:57  
标签:R0 R1 变址 地址 寻址 寄存器 ARM

寄存器间接寻址

寄存器间接寻址就是以寄存器中的值作为操作数的地址,而操作数本身存放在存储器中。例如以下指令:

LDR R0,[R1]   /*R0←[R1]*/
STR R0,[R1] /*[R1]←R0*/

第一条指令将以R1的值为地址的存储器中的数据传送到R0中。第二条指令将R0的值传送到以R1的值为地址的存储器中。

ARM的数据传送指令都是基于寄存器间接寻址,即通过Load/Store完成对数据的传送操作。

基址加偏址寻址(变址寻址)

基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量(用12位表示,不超过4KB)相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。

变址寻址方式可以分为:前变址(Pre-indexed)、自动变址(Auto-indexed)和后变址(Post-indexed)。

  1. 前变址模式
LDR R0,[R1,#4] ;R0←[R1+4]
  1. 自动变址模式
LDR R0,[R1,#4]! ;R0←[R1+4]、R1←R1+4
  1. 后变址模式
LDR R0,[R1] ,#4 ;R0←[R1]、R1←R1+4

偏移地址

地址偏移除了可以是一个12位的立即数,还可以是另一个寄存器,并且在加到基址寄存器之前还可以先经过移位操作,如:

LDR R0,[R1,R2]    ;R0←[R1+R2]
LDR R0,[R1,R2,LSL #2] ;R0←[R1+R2*4]

传送数据类型

ARM处理器支持的传送数据类型可以是有符号和无符号的8位字节、16位半字、32位字,最高位表示符号位(正数为0,负数为1)。对于字节操作,在指令中增加了字母B,对于半字,在指令中增加了字母H进行标识。默认是字操作,不加数据类型标识。如:

LDRB R0,[R1]  ;R0←mem8[R1], 加载8位字节数据到寄存器R0,零扩展到32位
LDRH R1,[R0,#20] ;R0←mem16[R0+20] 加载16位半字到寄存器R1 ,零扩展到32位

这时,传送的地址可与任意字节、半字对齐,而不限于4字节对齐。

块拷贝寻址(多寄存器寻址)

块拷贝寻址是多寄存器传送指令LDM/STM的寻址方式。通过一条指令可以把一个数据块加载到多个寄存器中,也可以把多个寄存器中的内容保存到存储器中。这种寻址方式中的寄存器可以是R0-R15这16个通用寄存器中的部分或全部。如:

LDMIA   R0,{R1,R2,R3,R4}  
;R1←[R0]
;R2←[R0+4]
;R3←[R0+8]
;R4←[R0+12]

该指令的后缀IA表示在每次执行完加载/存储操作后,R0按字长度增加,因此,指令可将连续存储单元的值传送到R1~R4。

LDM/STM指令依据其后缀名(如:IA,DB)的不同,其寻址的方式也有很大不同。这些后缀可以定义存储器地址的增长是向上还是向下,以及地址的增减与指令操作的先后顺序(即:操作先进行还是地址的增减先进行)。

这些后缀可以分成两大类:一类用于数据的存储与读取,这类后缀有:IA、IB、DA、DB;另一类用于堆栈的操作,即压栈和出栈,这类后缀有:FD、ED、FA、EA。

这些后缀的含义是:

  • IA(Increment After) 操作完成后地址递增
  • IB(Increment Before)地址先增后完成操作
  • DA(Decrement After)操作完成后地址递减
  • DB(Decrement Before)地址先减后完成操作
  • FD (Full Decrement)满递减堆栈
  • ED (Empty Decrement)空递减堆栈
  • FA(Full Aggrandizement)满递增堆栈
  • EA(Empty Aggrandizement)空递增堆栈

块拷贝寻址示例

嵌入式:ARM间接寻址、变址寻址与多寄存器寻址_间接寻址

例:分析下面两条指令的作用,并分析基址寄存器的变化有什么不同?

LDMIA   R0!,{R2-R9} 
STMIA R1,{R2-R9}

这两句的作用是将R0指向的连续8个存储单元的内容拷贝到R1指向的连续8个单元中去。

这两句执行完毕后,R0的内容增加了32个字节,这是由于使用了自动变址符号“!”,而R1的内容保持保持不变。

注意:在堆栈操作中总是要指定自动变址,否则,以前保存的内容会因为堆栈寄存器的基址不变将在下一次堆栈操作时遭到破坏!

参考文献:

孟祥莲.嵌入式系统原理及应用教程(第2版)[M].北京:清华大学出版社,2017.

标签:R0,R1,变址,地址,寻址,寄存器,ARM
From: https://blog.51cto.com/u_15736437/5951053

相关文章

  • 自学HarmonyOS应用开发(54)- 校正定位偏差
    上一篇文章已经介绍了如果获取当前所在位置的方法,这种方法存在一个问题:和实际位置之前存在500米左右的偏差。原因调查经过一番调查,结论是gps信号使用的是WGS-84坐标系,而高德......
  • ARM Neon 简介
    “ARMAdvancedSIMD”,nick-named,itprovides:    (1)、Asetofinterestingscalar/vectorinstructionsandregisters(thelatteraremappedtothesamechi......
  • (给大家科普一下)皇家国际游戏网址(hj8828.vip)开源OpenHarmony已推出14个行业发行版
    开源OpenHarmony已推出14个行业发行版IT之家8月8日消息,据财联社报道,华为HarmonyOS设备数加上鸿蒙智联设备数已突破4.7亿台,此前华为正式发布了HarmonyOS3系统。目......
  • (给大家科普一下)皇家国际游戏网址(hj8828.vip)诚迈科技落子OpenHarmony,
    诚迈科技落子OpenHarmony,隆重发布鸿诚志远(HongZOS)发行版11月3日,诚迈科技(南京)股份有限公司(以下简称“诚迈科技”)在东莞松山湖成功举办“鸿雁于飞·至诚志远——开源鸿蒙·诚......
  • earmusic任意文件读取漏洞[代码审计]
    怎么发现的,我也不懂啊。师傅怎么说,我跟着照做,毕竟技术不到位啊。功能点分析,反正这个下载的按钮可以存在漏洞。复现过程概述这个漏洞产生在用户端,首先去注册一个用户......
  • Pycharm异常处理
    异常处理&调试(类与对象再讲调试)异常:在运行代码过程中遇到的任何错误,大有error字样的都为异常异常处理:对代码中所有可能会出现的异常进行处理疑问:我们为什么要处理异常?......
  • 在不同电脑间同步pycharm的配置
    备份文件同步法最传统的方法就是把配置文件备份,然后在其它电脑上通过导入的方式来恢复,这种方法在很多软件中都实测可行。具体对应到pycharm中,可以在pycharm菜单栏file-......
  • 【数学模型】基于ARMR模型模拟风速附matlab完整代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • 【牛角书】基于HarmoyOS的登陆界面实现
    本项目作为鸿蒙开发课的大作业,供大家学习,本项目主要实现了,登录、注册修改密码界面的实现,并且实现了三个页面之间的互相切换。一、项目搭建1.1、项目配置这里注意API要用......
  • 【python/pycharm】豆瓣top250电影
    学弟给的importreimportrequestsurl="https://movie.douban.com/top250"headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/5......