ARM指令的寻址方式

这篇具有很好参考价值的文章主要介绍了ARM指令的寻址方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

立即寻址

立即寻址也称为立即数寻址,这是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数。这个操作数被称为立即数,对应的寻址方式也就称为立即寻址。例如以下指令:

ADD R0,R0,#1 ;R0←R0+1

ADD R0,R0,#0x3f ;R0←R0+0x3f

在以上两条指令中,第二个源操作数即为立即数,要求以“#”为前缀,对于以十六进制表示的立即数,还要求在“#”后加上“0x”或“&”。

寄存器寻址

寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是各类微处理器经常采用的一种方式,也是一种执行效率较高的寻址方式。例如以下指令:

ADD R0,R1,R2 ;R0←R1+R2

该指令的执行效果是将寄存器R1和R2的内容相加,其结果存放在寄存器R0中。

寄存器间接寻址

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

ADD R0,R1,[R2] ;

R0←R1+[R2] LDR R0,[R1] ;

R0←[R1] STR R0,[R1] ;[R1]←R0

在第一条指令中,以寄存器R2的值作为操作数的地址,在存储器中取得一个操作数后与R1相加,结果存入寄存器R0中。

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

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

基址变址寻址

基址变址寻址就是将寄存器(该寄存器一般称为基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元。采用变址寻址方式的指令常见有以下几种形式,如下指令所示:

LDR R0,[R1,#4] ;R0←[R1+4]

LDR R0,[R1,#4]! ;R0←[R1+4]、R1←R1+4

LDR R0,[R1],#4 ;R0←[R1]、R1←R1+4

LDR R0,[R1,R2] ;R0←[R1+R2]

在第一条指令中,将寄存器R1的内容加上4形成操作数的有效地址,从而取得操作数存入寄存器R0中。

在第二条指令中,将寄存器R1的内容加上4形成操作数的有效地址,从而取得操作数存入寄存器R0中,然后,R1的内容自增4个字节。

在第三条指令中,以寄存器R1的内容作为操作数的有效地址,从而取得操作数存入寄存器R0中,然后,R1的内容自增4个字节。

在第四条指令中,将寄存器R1的内容加上寄存器R2的内容形成操作数的有效地址,从而取得操作数存入寄存器R0中。

多寄存器寻址

采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送。这种寻址方式可以用一条指令完成传送最多16个通用寄存器的值。例如以下指令:

LDMIA R0,{R1,R2,R3,R4} ;

R1←[R0] ;

R2←[R0+4] ;

R3←[R0+8] ;

R4←[R0+12]

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

相对寻址

与基址变址寻址方式相类似,相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。以下程序段完成子程序的调用和返回,跳转指令BL采用了相对寻址方式:

BL NEXT ;跳转到子程序NEXT处执行

……

NEXT

……

MOV PC,LR ;从子程序返回

 堆栈寻址

堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使用一个称为堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。

ARM微处理器所支持的批量数据加载/存储指令可以一次在一片连续的存储器单元和多个寄存器之间传送数据,批量加载指令用于将一片连续的存储器中的数据传送到多个寄存器,批量数据存储指令则完成相反的操作。

LDM(或STM)指令的格式为:

LDM(或STM){条件}{类型} 基址寄存器{!},寄存器列表{∧}

LDM(或STM)指令用于从基址寄存器所指示的一片连续存储器到寄存器列表所指示的多个寄存器之间传送数据,该指令的常见用途是将多个寄存器的内容入栈或出栈。当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(Full Stack),而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(Empty Stack)。同时,根据堆栈的生成方式,又可分为递增堆栈(Ascending Stack)和递减堆栈(Decending Stack),当堆栈由低地址向高地址生成时,称为递增堆栈,当堆栈由高地址向低地址生成时,称为递减堆栈。这样就有4种类型的堆栈工作方式,ARM微处理器是支持基于堆栈操作的,其Rn寄存器为R13(SP)栈指针寄存器4种类型的堆栈工作方式,即:

  • 满递增堆栈(FA):堆栈指针指向最后压入的数据,且由低地址向高地址生成。
  • 满递减堆栈(FD):堆栈指针指向最后压入的数据,且由高地址向低地址生成。
  • 空递增堆栈(EA):堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。
  • 空递减堆栈(ED):堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。

{!}为可选后缀,若选用该后缀,则当数据传送完毕之后,将最后的地址写入基址寄存器,否则基址寄存器的内容不改变。

基址寄存器不允许为R15,寄存器列表可以为R0~R15的任意组合。

{∧}为可选后缀,当指令为LDM且寄存器列表中包含R15,选用该后缀时表示:除了正常的数据传送之外,还将SPSR复制到CPSR。同时,该后缀还表示传入或传出的是用户模式下的寄存器,而不是当前模式下的寄存器。

指令示例:

STMFD R13!,{R0,R1,R2,R14} ;高地址对应存标号高的寄存器,R14存入R13-4中 指定的地址,然后R2存入R13-8的地址中等

STMFD R13!,{R0,R4-R12,LR} ;将寄存器R0,R4到R12和LR(R14)存入堆栈

LDMFD R13!,{R0,R4-R12,PC} ;将堆栈内容恢复到寄存器R0,R4-R12和PC文章来源地址https://www.toymoban.com/news/detail-435937.html

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

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

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

相关文章

  • 【理解ARM架构】不同方式点灯 | ARM架构简介 | 常见汇编指令 | C与汇编

    🐱作者:一只大喵咪1201 🐱专栏:《理解ARM架构》 🔥格言: 你只管努力,剩下的交给时间! 在学习C语言的时候,我们会写个 Hello World 程序来入门,当我们写ARM程序,也该有一个简单的程序引领我们入门,这个程序就是点亮LED。 查看原理图,确定控制LED的引脚: 如上图是

    2024年02月05日
    浏览(32)
  • ARM 汇编合法立即数判断

    在ARM指令集中,一条汇编指令编码成32bits后,将不同的位数划分成不同的功能区间,比如 条件码 和 操作码 ,还有比特位要留给指令本身和寄存器使用, 通常情况下只有12-bits的长度可以用来表示立即数(immediate)。 12bits 可以表示的无符号数范围为: 0~4095 ,有符号数的范围

    2024年02月19日
    浏览(30)
  • 操作数的基本寻址方式

    1.隐含寻址 这种类型的指令,不是明显地给出操作数的地址,而是在指令中隐含着操作数的地址。 例如:8086汇编里的  CWD指令 ;把AX中的内容按符号位拓展成DX,AX双字。  2.立即寻址 指令中直接给出操作数本身,而不是操作数所在的地址。 例如: MOV AX,#123 3.直接寻址 指令中

    2024年02月04日
    浏览(30)
  • CentOS7重启指令(重启命令)reboot、shutdown -r now(立即重启服务器)、shutdown -h now(立即关机、关闭服务器)

    参考文章:CentOS 几种重启方式的区别 立即关机: 20230816 CentOS是一个基于Red Hat Enterprise Linux (RHEL)的免费开源操作系统。本文将深入介绍如何使用不同的命令在CentOS 7上进行系统重启和关机。 1.1 reboot 命令 在CentOS 7中,最直接也最常用的重启命令就是 reboot 。 这个命令会立即重

    2024年02月11日
    浏览(46)
  • 亚马逊宣布推出Rufus,这是一种新的由生成式AI驱动的对话式购物体验

      深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领域的领跑者。点击订阅,与未来同行! 订阅:https://rengongzhineng.io/ 。  亚马逊今天宣布推出Rufus,一款基于生成式人工智能

    2024年02月20日
    浏览(42)
  • 实验一8086计CPU系统寻址方式和汇编语言程序设计

    实验一8086计CPU系统寻址方式和汇编语言程序设 一、实验目的 (1)掌握8086CPU系统的逻辑地址和寻址方式。 (2)掌握8086CPU系统中机器数的表示方式。 (3)掌握指令的机器码表示方法。 (4)掌握堆栈的概念和操作过程。 (5)掌握集成开发环境下的程序设计和调试方法。 (6)掌握汇编语言实

    2023年04月22日
    浏览(34)
  • RISC-V基础指令之addi与lui(生成一个更大的立即数,包含负数符号拓展的特殊情况)

    这两条指令都是RISC-V体系结构中的整数指令,它们的功能和格式如下: lui指令的全称是Load Upper Immediate,它的功能是把一个20位的立即数加载到寄存器的高20位,低12位为0。它的格式是: lui rd, imm 其中,rd是目标寄存器,imm是20位的立即数。例如,lui x1, 0x12345会把0x12345000加载到

    2024年02月11日
    浏览(25)
  • 汇编实验4(99乘法表,整数分解,素数环,迷宫问题)【栈传参,递归,寻址方式】

    目录 一、99乘法表 汇编代码 效果 二、整数拆分 问题描述 c代码 汇编代码 效果 三、素数环 问题描述 c代码 效果 四、迷宫问题 问题描述 c代码 汇编代码 效果 汇编代码 效果 貌似有点问题,忘了把运算结果加上...... 问题描述 问题描述 输入一个N,输出所有拆分的方式。 如

    2023年04月09日
    浏览(28)
  • Unity 之 Addressable可寻址系统 -- 将Resources加载资源方式修改为Addressable加载 -- 实战(一)

    加载方式: Resources 使用同步加载方式;Resources 加载资源时,应用程序将会被阻塞,直到资源加载完成,这可能会导致应用程序出现卡顿或挂起的情况。 Addressables 使用异步加载方式。这意味着使用 Unity 而使用 Addressables 加载资源时,应用程序可以继续运行,而不会出现卡顿

    2024年02月05日
    浏览(28)
  • 【期末不挂科-单片机考前速过系列P2】(第二章:搞定寻址方式)经典例题盘点(带图解析)

    前言 大家好吖,欢迎来到 YY 滴单片机系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁 主要内容含: 欢迎订阅 YY 滴C++专栏!更多干货持续更新!以下是传送门! YY的《C++》专栏 YY的《C++11》专栏 YY的《Linux》专栏 YY的《数据结构》专栏 YY的《C语言基础》专栏 YY的《

    2024年02月01日
    浏览(31)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包