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

这篇具有很好参考价值的文章主要介绍了嵌入式: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]
    
  2. 自动变址模式

    LDR R0,[R1,#4]!	;R0←[R1+4]、R1←R1+4
    
  3. 后变址模式

    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.文章来源地址https://www.toymoban.com/news/detail-488963.html

到了这里,关于嵌入式:ARM间接寻址、变址寻址与多寄存器寻址的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 人工智能深入参与嵌入式控制器调试---ChatGPT回答TC377 PSRi寄存器ACT位置位失效问题

    做嵌入式开发的小伙伴们,有福利了! 当遇到调试过程中遇到难题,我们往往会找手册,上网搜索,找FAE来解决, 现在有了ChatGPT,尝试问了下调试的问题,如下  首先 我的问题描述 : 当设置 MCMCAN 控制器模式时,当 CCCRi.INT 被设置为 NORMAL 时,什么会导致 TC377 cpu PSRi 寄存

    2023年04月27日
    浏览(44)
  • 嵌入式开发——ARM介绍

    ARM是一种芯片架构,由英国的ARM Holdings公司开发和授权,被广泛应用于各种嵌入式系统、移动设备和消费电子产品中。ARM架构被设计成低功耗、高性能、可定制化的特点,能够满足各种应用场景下的需求。 ARM架构主要设计了以下几个部分内容: 指令集架构 (Instruction Set Ar

    2024年02月04日
    浏览(69)
  • 痞子衡嵌入式:不清i.MXRTxxx里FLEXSPI_MCR0寄存器保留位会造成IP CMD读写异常

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是 不清i.MXRTxxx里FLEXSPI_MCR0寄存器保留位会造成IP CMD读写异常 。 痞子衡曾经写过一篇文章 《改动i.MXRT1xxx里IOMUXC_GPR寄存器保留位可能会造成系统异常》,这篇文章提出了一个观点,即对于 MCU 外设寄存器应

    2024年03月09日
    浏览(55)
  • 痞子衡嵌入式:如果i.MXRT1xxx离线无法启动,请先查看SRC_SBMRx寄存器

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是 SRC_SBMRx寄存器对于定位i.MXRT1xxx离线无法启动问题的意义 。 最近有一位开源社区大佬在使能 RT1050 BEE 加密过程中遇到无法启动问题,折腾到一度崩溃,甚至想要弃坑。痞子衡哪能让这位“老乡”跑掉,连

    2024年02月19日
    浏览(40)
  • 嵌入式学习---ARM时钟体系

    按 一定电压幅度 , 一定时间间隔 连续发出的脉冲信号。它是一个周期性的信号,每个周期内包含一个上升沿和一个下降沿。时钟脉冲的上升沿和下降沿通常用于触发和同步各个电子元件的操作,例如CPU的指令执行、数据传输、寄存器更新等。 时钟频率是指时钟脉冲的频率

    2024年01月16日
    浏览(62)
  • 嵌入式:ARM Day6

    目的:1.输入\\\'a\\\',显示\\\'b\\\',将输入的字符的ASCII码下一位字符输出            2.原样输出输入的字符串 源码: uart4.h  uart4.c main.c 结果1: 结果2: 

    2024年02月12日
    浏览(46)
  • ARM+LINUX嵌入式学习路线

    嵌入式学习是一个循序渐进的过程,如果是希望向嵌入式软件方向发展的话,目前最常见的是嵌入式Linux方向,关注这个方向,大概分3个阶段: 1、嵌入式linux上层应用,包括QT的GUI开发 2、嵌入式linux系统开发 3、嵌入式linux驱动开发 嵌入式目前主要面向的几个操作系统是,

    2024年02月02日
    浏览(64)
  • 嵌入式学习52-ARM1

    知识零散: 1.flash:                                                                                                                                                           nor flash    可被寻地址                                               

    2024年04月14日
    浏览(37)
  • 嵌入式:ARM Day4

     源码:         在上述代码中,int *ptr定义了一个指向整数类型的指针ptr,(int *)将地址0x5000A28强制转换为整数类型的指针,后续可以通过*ptr访问与修改该地址空间中的值。  

    2024年02月12日
    浏览(51)
  • 嵌入式系统——ARM架构及分类

      “架构”(Architecture)指的是功能规范,ARM架构即是ARM处理器的功能规范,包括以下主要内容: 指令集:每条指令的功能,指令在存储器中的表示方法(编码); 寄存器集:寄存器的数量、大小、功能,以及寄存器的初始状态; 异常模型:不同特权级、异常类型,以及采

    2024年02月02日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包