arm的汇编指令精选合辑
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,
- 什么是LED驱动时序?LCD背光驱动程序设计(04-26)
- LCD驱动的移植及其GUI仿真如何进行,LCD数模转换现实原理及其源代码(04-25)
- wince代码写入LCD驱动参考,数码产品怎样分别是不是LCD坏点(04-26)
- ARM微处理器助记符指令及其功能描述(04-30)
- 布线工程师如何充分“掌控”时钟信号?(02-21)
- FPGA组成、工作原理和开发流程(10-13)