浅析ARM指令的寻址方式

来源 :电脑知识与技术 | 被引量 : 0次 | 上传用户:aqcnbbz1
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘要:寻址方式是汇编语言中的一个重要内容,同时也是学习的难点之一。该文通过以ARM汇编语言为例,指出各种ARM指令的寻址方式的特点、分析比较各寻址方式间的区别,并通过具体实例来阐述不同寻址方式对内存的访问。
  关键词:ARM汇编语言;ARM指令;寻址方式;多寄存器寻址;堆栈寻址
  中图分类号:TP312文献标识码:A文章编号:1009-3044(2012)06-1249-03
  Analysis of ARM Instruction Addressing Mode
  WANG Ru
  (Liaoning Equipment Manufacturing Technical College, Shenyang 110161, China)
  Abstract: Addressing mode is an important part for assembly language, At the same time,It is hard to learn. This article based on ARM as? sembly language, The ARM instruction addressing mode features, Analysis and comparison of the difference between various addressing modes, and through some concrete examples to illustrate different addressing modes for a memory access.
  Key words: ARM assembly language; ARM instructions; addressing mode; multiple register addressing; stack addressing
  在嵌入式系统开发中主要采用的计算机语言有汇编语言和C、C 、JAVA等语言。其中C、C 、JAVA等高级语言主要用作嵌入式系统的应用程序的开发;而汇编语言主要用来进行嵌入式系统的初始化操作。由于每个独立的嵌入式系统产品都要有初始化部分,且汇编语言具有可直接访问硬件,提高运行效率等优点,因此汇编语言在嵌入式系统开发中占有非常重要的地位。
  汇编语言在进行程序设计时必须考虑到机器的指令系统、寻址方式及存储设备的设置和功能,而熟练应用机器所采用的各种寻址方式,是运用汇编语言进行程序设计的根本。然而在教学过程中,我们发现很多同学对寻址方式知识点掌握不够好,这直接影响到指令的理解,进而影响整个汇编语言的学习。
  本文以ARM汇编语言为例,介绍ARM指令的八种寻址方式,分析各种寻址方式的特点,找出它们之间的区别和联系,从而形成正确的概念,便于理解和学习。
  首先,我们要明确几个概念。什么是寻址?寻址是处理器根据指令中所给出的信息找到操作数存储的地方。即寻找操作数的地址。什么是寻址方式?寻址方式就是给出不同的寻找操作数的方式。寻址方式的分类有很多种,本文归纳为八种,即寻找操作数有八种方式。
  在寻址过程中,操作数的存放位置决定着寻址的方式。操作数一般存放在寄存器或存储器中。寄存器位于CPU内部,它的存取速度比存储器要快得多。下面我们开始逐一分析这几种寻址方式,我们以源操作数的寻址方式为例。
   1立即数寻址
  操作数在指令中给出,取出指令即取出数据。例如:
  MOV R0, #0x8800;R0←#0x8800
  该指令含义是将#0x8800数据传送给R0寄存器。其中,#0x8800就是操作数,本方式特点是操作数不用寻找,操作数在指令中。
   2寄存器寻址
  寄存器中的数值直接作为操作数。例如:
  MOV R0, R1; R0←R1
  该指令的含义是将R1寄存器的数值传送给R0寄存器。其中,要寻找的操作数存放在R1的寄存器中,即本方式的特点是操作数存放在寄存器中。
   3寄存器间接寻址
  寄存器存放的是操作数的地址。例如:
  LDR R0 , [R2];R0←[R2]
  该指令的含义是将R2中的数值作为地址,取出地址中的数据存在R0中。其中,[]表示R2中的数值表示的是操作数的地址。本方式的特点是操作数存放在存储器中,寄存器里存放的是操作数的地址。这与C语言中的指针概念有些类似。
   4寄存器移位寻址
  对第二个源操作数进行移位操作后为所求操作数。例如:
  ADD R6, R3, R1, LSL#2;R6←R3 R1 * 4
  该指令含义为将R1寄存器的值进行逻辑左移2位后所得结果,与R3寄存器的值进行加法运算,并将结果传送给R6寄存器。其中,LSL代表逻辑左移,对距离它最近的寄存器R1的数据进行移位,#2代表移2位。寄存器移位寻址的移位方式及其含义如下所示:
  LSL:逻辑左移(Logical Shift Left),寄存器中字的低端空出的位补0。
  LSR:逻辑右移(Logical Shift Right),寄存器中字的高端空出的位补0。
  ASR:算术右移(Arithmetic Shift Right),移位过程中保持符号位不变,即如果源操作数为正数,则字的高端空出的位补0,否则补1。
  ROR:循环右移(Rotate Right),由字的低端移出的位填入字的高端空出的位。
  RRX:带扩展的循环右移(Rotate Right extended by 1 place),操作数右移一位,高端空出的位用原C标志值填充。
  这种寻址方式运算起来有四个步骤:1)将第二个源寄存器中的值由十六进制转换成二进制;2)按照移位方式进行移位、补位;3)将运算好的二进制转换回十六进制(即所寻找的操作数);4)参加指令运算。这一步初学者经常遗忘,通常通过前三步运算得到操作数,同学认为这应该是指令的结果,其实找到操作数只是指令执行的一部分而已,找操作数的最终目的是执行指令。
  这种寻址方式的特点是寄存器中的数值进行移位后,即为所寻操作数。
   5基址加变址寻址
  将寄存器中的内容与指令中偏移量相加作为操作数的地址。例如:
  LDR R0 , [R1,#0X4];R0←[R1 4]
  该指令的含义是将R1寄存器的值与#0x4相加所得数值为操作数的地址,根据地址可找到操作数,然后将操作数传送为R0寄存器。
  其中,[]表示里面的数值是操作数的地址。本方式的特点是操作数存放在存储器上,而操作数的地址是由寄存器值与指令中偏移量相加而得来。本方式与寄存器间接寻址基本相同,区别在操作数据地址的取法上,前者需要寄存器运算得出,后者直接存在寄存器中。在生活中,基址加变址的方式随处可见,例如描述一个新的地址时我们经常说“某某大楼向西一百米”。
   6多寄存器寻址
  前面的寻址方式都是一条指令中寻找一个操作数地址;本方式特点是一条指令可以寻找多个操作数的地址。例如:
  LDMIA R0,{R1,R2,R3,R4} ; R1←[R0],R0 4
  ; R2←[R0],R0 4
  ; R3←[R0],R0 4
  ;R4←[R0],R0 4
  该指令的含义是将数据从存储器复制到寄存器中,操作数的地址在R0寄存器中,通过R0确定要复制的数据,传递后地址自增4。IA这里表示传递方式,具体含义如下所示:
  IA:先传递数据,后地址自增;(类似C语言中的i )
  IB:地址先自增,后传递数据;(类似C语言中的 i)
  DA:先传递数据,后地址自减;(类似C语言中的i--)
  DB:地址先自减,后传递数据;(类似C语言中的--i)
  这种寻址方式运算起来分以下三步:1)根据指令助记符确定数据传送方向:LDM代表存储器传送寄存器;STM代表寄存器传送存储器;2)根据寄存器中的地址确定操作数;3)根据不同的传递方式进行传递。
  本方式特点是操作数存放在存储器上,操作数的地址存放在寄存器中,通过寄存器值的自增或自减确定下个操作数的地址。
   7堆栈寻址
  堆栈是一种数据结构,堆栈是特定顺序进行存取的存储区,操作顺序分为“后进先出”和“先进后出”,堆栈寻址时隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),指针所指向的存储单元就是堆栈的栈顶。存储器生长堆栈可分为两种:
  向上生长:向高地址方向生长,称为递增堆栈(Ascending Stack)。
  向下生长:向低地址方向生长,称为递减堆栈(Decending Stack)。
  堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈(Full Stack);堆栈指针指向下一个要放入的空位置,称为空堆栈
  (Empty Stack)。
  这样就有四种类型的堆栈工作方式:
  满递增FA堆栈:堆栈指针指向最后压入的数据,且由低地址向高地址生成。
  满递减FD堆栈:堆栈指针指向最后压入的数据,且由高地址向低地址生成。
  空递增EA堆栈:堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。空递减ED堆栈:堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。
  具体如图1所示。
  
   c满递减FD堆栈d空递减ED堆栈
  图1
  例如指令:LDMFA R0,{R1,R2,R3}
  这种寻址方式运行起来分以下三步:1)根据STM和LDM知道是出栈还是进栈;
  2)根据FA、FD、EA、ED和R0值,画出堆栈图;3)根据堆栈的特点、传递方式进行传递数据:如果是进栈,传递方式中有F,代表R0更新,数据再存入;传递方式中有E,代表数据先存入,R0再更新;如果是出栈,传递方式中有F,代表数据先取出,R0再更新;传递方式中有E,代表R0先跟新,数据再取出。
  堆栈寻址与多寄存器寻址功能上是相同的,两者区别在于寻址过程中地址变换的方法不同。多寄存器寻址地址变换主要采用IA、IB、DA、DB;而堆栈寻址地址变换主要采用FA、FD、EA、ED。
   8相对寻址
  相对寻址是基址加变址寻址的一种变通,由程序计数器PC提供基地址,指令中的地址碼字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。例如指令:
  BL delay
  …………
  delay:
  …………
  MOV PC,LR
  以上是对寻址方式的特点进行分析,将抽象且较难理解的寻址方式具体化、形象化,同时对复杂的寻址方式运算过程做以总结。这对今后的指令系统和程序设计学习会有很大的帮助。
  参考文献:
  [1]吴尚.单片机80C51寻址方式的教学方法探讨[J].芜湖职业技术学院学报,2007,9(3).
  [2]朱琼玲,唐波.MCS-51单片机汇编指令的寻址方式的通俗解析[J].科技信息,2009(31).
  [3]陈佳.寻址方式教学方法的研究与研讨[J].科技技术,2009(16).
  [4]孙晔.ARM嵌入式系统及应用[M].南京:江苏教育出版社,2011.
其他文献
通过计算给出了在LHC能区非对心核一核碰撞中由椭圆流v2表示的高横动量直接光子的方位角不对称性.该高横动量光子是由喷注与热密介质相互作用而辐射出来的.光子椭圆流与强子椭
分析了非再生(前向放大AF)中继多频带UWB两跳协作通信系统的信噪比,推导其误符号率SER的闭式表达式及上限,并在此基础上分别针对两个优化目标即发送总功率最小化及覆盖范围最大化