微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > arm的汇编指令精选合辑

arm的汇编指令精选合辑

时间:06-04 来源:网络整理 点击:

AY2为字数组

  ADR R3 ENDARR1 ;ARRAY1+2

  LOOP LDRSH R0,[R1],#2 ;取得有符号半字数,扩展为字

  STRR0,[R2],#4

  CMP R1,R3

  BLT LOOP

  3. 双字Load/Store类指令

  功能:提供ARM寄存器和内存之间双字(64位)数据的传送。

  格式:

  (1) 零偏移(zero offset)

  LDR|STR{《条件码》}D Rd,[Rn]

  (2) 前变址格式(pre-indexed offset)

  LDR|STR{条件码》}D Rd,[Rn,《offset》]{!}

  (3) 程序相对偏移(pregram-relatve)

  LDR|STR{《条件码》}D Rd,LABEL

  (4) 后变地址格式(post-indexed offset)

  LDR|STR{《条件码式》}D Rd,[Rn],《offset》

  其中:

  Rd 读取或指令寄存器其中的一个,另一个是R(d+1).Rd必须是偶数寄存器,且不是R14.

  Rn 除非指令为零移,或不带写回的前索引,否则R不允许是Rd和R(d+1)相同。

  Offset 加在Rn上的偏移量。含义同3.2.3节第1条指令。

  Label 程序相对偏移表达式.Label必须是在当前指令的±255字节范围内。

  ! 可选后缀。若有"!",则包含偏移量的最后地址写回到Rn.

  注释:

  对于双字节传送,地址必须是8的倍数。若系统有系统协处理器,可允许对准检查。若允许对准检查,慢非双字准的64位传送将引起对准异常。该指令适用于ARMv5TE指令系统及以上版本。

  例:

  LDARD R6,[R11] ;((R11)→R6,((R11)+4)→R7

  STRD R4,[R9,#24] ;(R4)→(R9)+24,(R5)→(R9)+24

  4. 多寄存器Load/Store类指令

  功能:读取和存储多个寄存器,可以传送R0~R15的任何组合。

  格式:

  (1) 标准格式

  LDR|STM{《条件码》}《mode》Rn{!}《寄存器》

  (2) 非用户模式下,用下面可以同时把当前的SPSR写入CPSR中,转向用户模式,寄存器组饮包含PC.

  LDM{《条件码》}《mode》Rn{!},《寄存器组+PC》^

  (3) 非用户模式下,用下面格式可以实现访问用户模式的寄存器,但寄存器组不包含PC.

  LDM|STM{《条件码》}《mode》Rn,《寄存器组-PC》^

  其中:

  mode IA、IB、DA、DB、FD、ED、FA、EA之一。

  Rn 基址寄存器,装有传送数据的初始地址。Rn是不允许是R15。

  ! 可选后缀。若有"!",则结果地址写回到Rn。

  Reglist读取或存储的寄存器列表,包含在括号中,它也可包含寄存器的范围。若包含多于1个寄存器列表或包含寄存器范围,则必须用逗号分开。

  ^ 可选后缀,不允许用户模式或系统模式下使用。它有两个目的:

  l操作码是LDM且reglist中饱包含PC(R15),那么出除了正常的多寄存器传送外,将SPSR也拷贝到CPSR中。这用于从异常处理返回,仅在异常模式下使用。

  l数据传入或传出的是用户模式的寄存器,而不是当前模式的寄存器。

  注意:对于LDM指令,如包含PC,位0=1时,转至Thumb状态。寄存器组中一般不应有Rn,它至少有1个寄存器。FD、ED、FA、DA用于堆栈操作;IA、IB、DA、DB用于一般的数据传送。

  注释:

  (1)非字对准地址

  这些指令忽略地址的位[1:0]。在带有系统协处理器的系统中,若对准检查使能,则这2位的非零值将引起对准异常。

  (2)读取到R15

  到R15(程序计数器)的读取将引起处理器转移到读取地址处的指令。在ARM体系结构v5及以上版本的T变量中若读取的位[0]置位,则到R15的读取将导致处理器切换到执行Thumb指令。

  (3)带写回的存/取基址寄存器

  如果Rn包含在寄存器列表中,且用后缀"!",指明要写回(write back),那么:

  l若操作码是STM,县城Rn是寄存器列表中数字最小的寄存器,则将初值保存。

  lRn的读取和储存值不可预知。

  例1:若保存3个工作寄存器状态和返回地址:

  STMFD R13!,{R0-R2,R14}

  若恢复3个工作寄存器状态和返回地址:

  LDMFD R13!,{R0-R2,R14}

  例2:

  LDMFD R8,{R0,R2,R9} ;((R8))→R0

  ;((R8)+4)→R2

  ;((R8)+8)→R9

  STMDB R1!,{R3-R6,R11,R12} ;(R3)→R1-4

  ;(R4)→R1-8

  ;(R5)→R1-12

  ;(R6)→R1-16

  ;(R11)→R1-20

  ;(R12)-24→R1

  STMD R13!,{R0,R4-R7,LR} ;寄存器进栈

  例3:子程序调用

  SUMB1 STMFD SP!,{R0-R2,R14} ;保护R0~R2和返回地址

  …… ;其它指令

  BL ;允许子程序嵌套

  …… ;其它指令

  LDMFD SP!,{R0-R2,R15} ;恢复R0~R2,返回子程序调用程序后执行

  5. 预读取PLD指令

功能:cache预读取(PLD,

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top