arm的汇编指令精选合辑
数常量,取值在-4095~+4095之间。
(3) ±Rm{.shift}
其中:
± 可选负号。若有符号"-",则从Rn中减去偏移量。否则,将偏移量加到Rn中。
Rm 内含偏移量的寄存器。Rm不允许是R15。
Shift Rm的可选移位方法。可以是ASR、LSL、LSR、ROR、RRX的任何一种。详细说明见ARM数据处理类指令的第二操作数。
(4) 字地址对准
大多数情况下,必须保证用于32位传送的地址是32位对准的。
若系统中有协处理器(CP15),则允许对准检查,若允许对准检查,则非字对准的32位传送会引起对准异常。若系统中没有系统协处理品(CP15),或禁止对准检查,则有:
对于STR,将指定的地址取成4的倍数。
对于LDR,则
l将指定的地址取成4的倍数。
l由结果地址读取4个字节的数据。
l依据地址的位[1:0],将读取的数据循环右移1、2或3个字节。
对于小端存储系统,这使寻址的字节占用寄存器的最低有效字节。
对于大端存储系统,这使寻址的字节占用:
-位[31:24],若地址的位[0]为0;
-位[15:8],若地址的位[0]为1。
(5) 使用R15读取
使用R15(程序计数器)读取会引起处理器转移到所读取地址的指令。
对于读取值的位[1:0],有:
l对于ARM体系结构v3及以下版本,忽略位[1:0]。
l对于ARM体系结构v4及以上版本的非T变量,位[1:0]为0。
l对于ARM体系结构v5及以上版本的T变量,则有
-对于读取到R15的值,其位[1:0]不允许是ob10;
-对于读取到R15的值的位[0]置位,则处理器转到Thumb状态。
当使用R15读取时,不能使用后缀"B"或"T"。
(5) 使用R15存储
通常应尽量避免使用R15存储。
若使用R15存储,则存储的值是当前指令的地址加上实现所定义的常量。对于特写的处理器这个常量始终不变。
例 1:将R0中的内容存放进外设中。
LDR R1,UARTADD ;将UART地址放进R1中
STRB R0,[R1] ;将数据放进外设中
UARTADD & &1000000 ;UARTR的地址值
例 2:
LDR R8,[R10]! ;((R10))→R8
LDRNE R2,[R5,#960]! ;Z≠14时((R5)+960)→R2,(R5)+960→R5
STR R2,[R9,#consta-struc] ;consta-struc是常量的表达式,该常量的范围为1~4095
STRB R0,[R3,-R8,ASR#2] ;R0→(R3-R8/4),存储R0的最低有效字节,R3和R8不变
STR R%,[R7],#-8 ;读取一个字,该字位于标号loacaldata所在地址
2. 半字和有符号字节Load/store类指令
功能:提供ARM寄存器和内存之间半字(16位)和有符号字节(8位)数据的传送。
格式:
(1) 零偏移(zero offset)
LDR|STR{《条件码》}H|SH|SB Rd,[Rn]
(2) 前变址(pre-indexed offset)
LDR|STR{《条件码》}H|SH|SB Rd,[Rn,《offset》]{!}
(3) 程序相对偏移(pregram-relatve)
LDR|STR{《条件码》}H|SH|SB Rd,Label
(4) 后变址(post-indexed offset)
LDR|STR{《条件码》}H|SH|SB Rd,[Rn],《offset》
其中:
H|SH|SB 表示数据类型选择。
SH 对有符号半字(仅LDR);
H 对无符号半字;
SB 对有符号字节(仅LDR)。
Label 程序相对偏移表达式。必须是在当前指令的±255字节范围内。
Offset 加在Rn上的偏移量。含义见注释。
Rn和"!"同前面第1条(LDR和STR字和无符号字节)。
注释:
(1) offset说明
前变址和后变址格式中的offset可以是下两种形式之一:
①expression含义同前一条指令,取值在-255~+255范围之间。
②±Rm含义同前一条指令。
(2) 半字传送的地址对准
半字传送的地址必须是偶数。
若系统有系统协处理器(CP15),则可允许对准检查。若允许对准检查,则非对准的16位传送会引起对准异常。若系统没有系统协处理器(CP15)或禁止对准检查,则有
l非半字对准的16位读取将使Rd内容不可靠;
l非半字对准的16位存储将使在address和(address-1)的2个字节不可靠。
(3) 不能将半字或字节读取到R15。
例 1:
LDREQSH R11,[R6] ;(有条件地)R11←[R6],读取16位半字,有符号扩展到32位
LDH R1,[R0,#22] ;R1←[R0+22],读取16位半字,零扩展到32位
STR R4,[R0+R1] ;存储最低的有效半字到R0+R1地址开始的两个字节,地址写回到
;R0
LDRSB R6,constf ;读取位于标号constf地址中的字节,有符号扩展
例 2:
ADD R1,ARRAY1 ;ARRAY1 为半字数组
ADR R2,ARRAY2 ;ARR
- 什么是LED驱动时序?LCD背光驱动程序设计(04-26)
- LCD驱动的移植及其GUI仿真如何进行,LCD数模转换现实原理及其源代码(04-25)
- wince代码写入LCD驱动参考,数码产品怎样分别是不是LCD坏点(04-26)
- ARM微处理器助记符指令及其功能描述(04-30)
- 布线工程师如何充分“掌控”时钟信号?(02-21)
- FPGA组成、工作原理和开发流程(10-13)