RAM学习笔记Word格式文档下载.docx
《RAM学习笔记Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《RAM学习笔记Word格式文档下载.docx(21页珍藏版)》请在冰豆网上搜索。
本位设置当前指令运算结果的bit[31]的值。
当两个补码表示的有符号数运算时,N=1表示运算结果为负数,N=0表示运算结果为正数或零
Z(zero)
Z=1表示运算结果为零,Z=0表示运算结果不为零。
对于CMP指令,Z=1表示两个数大小相等
C(carry)
1、在加法指令中(包括CMN)当结果产生了进位,则C=1,表示无符号数运算发生上溢出,其他情况C=0
2、在减法指令中(包括CMP),当运算发生借位,则C=0,表示无符号数运算发生下溢出,其他情况C=1
3、对于包含移位操作的非加减运算指令,C包含最后一次溢出的位的数值。
4、对于其他非加减法运算指令,C位的值通常不受影响
V(oVerflow)
对于加减法运算指令,当操作和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出,通常其他的指令不影响V位
Q
I
I=1时禁止IRQ中断
F
F=1时禁止FIQ中断
T
T=0表示执行ARM指令,T=1表示执行Thumb指令。
M[3:
0]
控制处理器模式。
SPSR:
备份程序寄存器。
当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容。
在异常中断程序退出时,可以用SPRS中保存的值来恢复CPSR。
ARM指令的分类及其寻址方式
ARM指令集可以分为:
跳转指令、数据处理指令、程序状态寄存器(PSR)传输指令、Load/Store指令、协处理器指令和异常中断产生指令6类
Load指令用于从内存中读取数据放入寄存器中,Store用于将寄存器的数据保存到内存中。
指令条件码
条件码
条件码助记符
含义
CPSR中条件标志位置
0000
EQ
相等(Equal)
Z=1
0001
NE
不相等notequal
Z=0
0010
CS/HS
无符号数大于等于CarrySet
C=1
0011
CC/LO
无符号数小于CarryClear
C=0
0100
MI
负数Minus
N=1
0101
PL
非负数Plus
N=0
0110
VS
上溢出overflowSet
V=1
0111
VC
没有溢出overflowClear
V=0
1000
HI
无符号数大于Higher
C=1且Z=0
1001
LS
无符号数小于或等于LowerorSame
C=0或Z=1
1010
GE
带符号数大于或等于Greaterorequal
N=1且V=1,或N=0且V=0
1011
LT
带符号数小于Lessthen
N=1且V=0,或N=0且V=1
1100
GT
带符号数大于GreaterThen
Z=0且V=N
1101
LE
带符号数小于或等于LessorEqual
Z=1或N!
=V
1110
AL
无条件执行Always
1111
NV
该指令从不执行Never
ARMv3之前
未定义
该指令执行结果不可预测
ARMv3及ARMv4
该指令无条件执行
ARMv5以上版本
跳转指令
1、B跳转指令
2、BL带返回的跳转指令
3、BLX带返回和状态切换的跳转指令
4、BX带状态切换的跳转指令
指令
功能对CPSR的影响
MOV
传送指令
根据操作结果更新CPSR相应的值
MVN
将<
shifter_operand>
表示的数据的反码传送到<
Rd>
中,操作结果更新CPSR中相应的条件标志位
ADD
加法指令。
表示的数据与<
Rn>
中的值相加,结果保存在<
中,同时根据操作的结果更新相应的条件标志位
ADC
带位加法。
中的值相加,再加上CPSR中的C条件标志位的值,结果保存在<
SUB
减法指令。
从Rn中减去shifter_operand表示的值,结果送回Rd,根据操作结果更新CPSR中相应的条件标志。
当发生借位时,CPSR中的C位设置为0,没有借位,设置为1,与ADD的进位正好相反。
SBC
带位减法指令。
Rn减去shifter_operand中的值,再减去C条件标志位的反码,结果送回Rd,操作结果更新CPSR中相应的标志位
RSB
逆向减法指令。
Shifter_operand表示的值减去Rn值,结果送回Rd,操作结果更新CPSR。
RSC
带位逆向减法指令。
Shifter_operand表示的值减去Rn的值,再减去C条件标志位的反码,结果送回Rd。
操作结果更新CPSR
AND
逻辑与。
Shifter_operand表示的值与寄存器Rn的值按位做逻辑与操作,结果送回Rd,操作结果更新CPSR
ORR
逻辑或。
Shifter_operand表示的值与寄存器Rn的值按位做逻辑或操作,结果送回Rd,操作结果更新CPSR
EOR
异或。
Shifter_operand表示的值与寄存器Rn的值按位做逻辑异或操作,结果送回Rd,操作结果更新CPSR
BIC
位清处。
寄存器Rn的值与Shifter_operand表示的值的反码按位做逻辑与操作,结果送回Rd,操作结果更新CPSR
CPM
比较指令。
Rn中的值减去shifter_operand中的值,根据操作结果更新CPSR
CMN
基于相反数的比较指令。
Rn的值加上shifter_operand的数值,根据操作结果更新CPSR
TST
位测试。
Shifter_operand的值与Rn的值按位做与操作,根据结果更新CPSR
TEQ
相等测试指令。
Shifter_operand的值与Rn按位做异或操作,根据结果更新CPSR
移位指令
ASR
算数右移
LSL
逻辑左移
LSR
逻辑右移
ROR
循环右移
RRX
扩展的循环右移
乘法指令
MUL
32位乘法。
实现两个32的数(无符号/有符号数)的乘积,结果放到一个32位寄存器中,根据结果设置CPSR
MLA
32位带加数的乘法指令。
将两个32位的数(无符号/与符号)的乘积,再将乘积加上第3个操作数,并将结果存放到一个32位的寄存器中,根据运算结果更新CPSR
SMULL
64位有符号数乘法指令。
将两个32位有符号的数的相乘,结果的高32位放到一个32位的寄存器中,低32位放到另一个寄存器中,更新CPSR
SMLAL
64位带加数的有符号数乘法。
将两个32位的有符号数的64位乘积结果与<
RdHi>
和<
RdLo>
中的64位数相加,结果的告32位存放到一个32位寄存器中,低32位存放到另一个32位寄存器,更新CPSR
UMULL
64位无符号数乘法指令。
将两个32的有符号数的乘积的高32位存放到一个32位的寄存器中,低32位放到另一个寄存器中,更新CPSR
UMLAL
64位带加数的无符号数乘法指令。
将两个32位的无符号数的64位乘积结果与<
中的64位无符号数相加,加法结果的告32位存放到一个32位的寄存器中,乘积结果的低32位放到另一个寄存器中。
更新CPSR
状态寄存器访问指令
MRS
状态寄存器到通用寄存器的传送指令。
MSR
通用寄存器到状态寄存器的传送指令。
Load/Store内存访问指令
LDR
字数据读取指令。
从内存中将一个32位的字读取到指令中的目标寄存器中。
如果指令中寻址方式确定的地址不是字对齐的,则从内存中读取的数值要进行循环右移操作,移位的位数为寻址方式确定的地址的bits[1:
0]的8倍。
这样对于little-endian,指令想读取数据存放在目标寄存器的第8位;
对于bit-endian的内存模式,指令要读取的字节数据存放在目标寄存器的bit[31:
24](寻址方式确定的地址bit[0]为0或者bits[15:
8]寻址方式确定的地址为1)
LDRB
字节数据读取指令.从内存中将一个8位的字节数据读取到指令中的目标寄存器中。
并将寄存器的高24位清零
LDRBT
用户模式的字节数据读取指令。
从内存中将一个8为的字节数据读取到指令中的目标寄存器中。
并将寄存器的高24位清零。
当在特权级的处理器模式下使用本指令时,内存系统将该操作当做一般用户模式下的内存访问操作。
LDRH
半字数据读取指令。
从内存中将一个16位的半字数据读取到指令中的目标寄存器中。
并将寄存器的高16位清零。
如果指令的内存地址不是半字对齐的,指令会产生不可预知的结果
LDRSB
有符号的字节数据读取指令。
从内存中将一个8位字节数据读取到指令中的目标寄存器中。
并将寄存器高24位设置成该字节数据的符号位的值(即将该8位字节数据进行符号位扩展,生成32位字数据)
LDRSH
有符号的半字数据读取指令。
并将寄存器的高16位设置成该半字数据的符号位的值。
LDRT
用户模式的字数据读取指令。
从内存中将一个32位的字数据读取到指令中的目标寄存器中。
8]寻址方式确定的地址为1)。
STR
字数据写入指令。
用于将一个32位的字数据写入到指令中指定的内存单元。
STRB
字节数据写入指令。
用于将一个8位的字节数据写入到指令中指定的内存单元,该字节数据为指令存放源操作数的寄存器的低8位。
STRBT
用户模式字节数据写入指令。
将一个8位的字节数据写入到指定的内存中。
当在特权级的处理器模式下使用本指令时,内存系统将该操作当做一般用户模式下。
STRH
半字数据写入指令。
用于将一个16位的字节数据写入到指令中指定的内存单元,该半字数据为指令存放源操作数的寄存器的低16位。
STRT
用户模式字数据写入指令。
将一个32位的字数据写入到指定的内存中。
批量Load/Store内存访问指令
LDM
(1)
批量内存字数据读取指令。
将数据从连续的内存单元中读取到指令中寄存器列表中各寄存器中。
它主要用于块数据的读取、数据栈操作以及子程序中返回的操作。
当PC包含在LDM指令的寄存器列表中时,指令从内存中读取的字数据将被当做目标地址值,指令执行后程序将从目标地址处开始执行,即实现了跳转操作。
LDM
(2)
用户模式的批量内存字数据读取指令。
PC寄存器不能包含在LDM指令的寄存器列表中。
LDM(3)
带状态寄存器的批量内存字数据读取指令。
它同时将当前处理器模式的SPSR寄存器的内容复制到CPSR。
STM
(1)
批量内存字数据写入指令。
将指令中寄存器列表中的各寄存器值写入到连续的内存单元中。
它主要用于块数据的写入、数据栈操作以及进入子程序时保存相关的寄存器的操作。
STM
(2)
用户模式的批量内存字数据写入指令。
将指令中寄存器列表中的各寄存器(用户模式对应的寄存器)值写入到连续的内存单元中。
信号量操作指令
SWP
交换指令。
将一个内存字单元(该单元地址放在寄存器Rn中)的内容读取到一个寄存器Rd中,同时将另一个寄存器Rm的内容写入到该内存单元中。
当Rd和Rm为同一个寄存器时,指令交换该寄存器和内存单元的内容。
SWPB
字节交换指令。
将一个内存字节单元(该单元地址放在寄存器Rn中)的内容读取到一个寄存器Rd中,Rd的高24位设置为0,同时将另一个寄存器Rm的低8位内容写入到该内存单元中。
当Rd和Rm为同一个寄存器时,指令交换该寄存器低8位和内存单元的内容。
异常中断产生指令
SWI
软中断指令。
BKPT
断点中断指令。
ARM协处理器指令
CDP
协处理器数据操作指令。
是ARM处理器用于通知协处理器执行特定的操作。
该操作由协处理器完成。
如协处理器不能成功执行该操作,将产生未定义的指令异常操作中断
LDC
协处理器数据读取指令。
从一系列连续的内存单元将数据读取到协处理器寄存器中。
如协处理器不能成功地执行该操作,产生未定义指令异常中断。
STC
协处理器数据写入指令。
将协处理器的寄存器中的数据写入到一些列连续的内存单元中,如不能成功执行,产生未定义的指令异常中断。
MCR
ARM寄存器到到协处理器寄存器的数据传送指令。
MRC
协处理器寄存器到ARM就从那起的数据传送指令
伪操作
符号定义(Symboldefinition)
GBLA
声明一个ARM程序中的全局变量,并将其初始化为0
GBLL
声明一个全局逻辑变量,并将其初始化为{FALSE}
GBLS
声明一个全局串变量,并将其初始化为空串“”
语法格式:
<
glbx>
variable
LCLA
声明一个局部算术变量,并将其初始化为0
LCLL
声明一个局部逻辑变量,并将其初始化为{FALSE}
LCLS
声明一个局部串变量,并将其初始化为空串“”
lclx>
SETA
给一个算术变量赋值
SETL
给一个逻辑变量赋值
SETS
给一个串变量赋值
setbx>
variableexpr
RLIST
一个通用寄存器列表定义名称
nameRLIST{listofregisters}
CN
为一个协处理器的寄存器定义名称
nameCNexpr.Expr的数值范围为0~15
CP
为一个协处理其定义名称
nameCPexpr.Expr的数值范围为0~15
DN
为一个双精度VFP(向量浮点运算)寄存器定义名称
nameDNexpr.expr的数值范围为0~15
SN
为一个单精度VFP(向量浮点运算)寄存器定义名称
nameSNexpr.expr的数值范围为0~31
FN
为一个FPA寄存器定义名称
nameFNexpr.expr的数值范围为0~7
数据定义伪操作
LTORG
用于声明一个数据缓冲池的开始
MAP
用于定义一个结构化的内存表的首地址。
此时,内存表的位置计数器{VAR}设置成该地址值。
是MAP的同义词
MAPexpr{,base-register}
Expr位数字表达式或者是程序中的标号。
当指令中没有base-regisres时,expr即为结构化内存表的首地址。
当expr为程序中的标号时,该标号必须是已经定义过的。
Base-register为一个寄存器。
当指令中包含这一项时,结构化内存表的首地址为expr和base-register寄存器值的和
FILED
用于定义一个结构化内存表中的数据域。
#是FILED的同义词。
语法:
{lable}FIELDexpr
SPACE
用于分配一块内存单元,并用0初始化。
%是它的同义词
DCB
用于分配段字节内存单元,并用伪操作中的expr初始化之。
=是它同义词。
DCD
用于分配一段字内存单元(分配的内存都是字对齐的),并用伪操作中的expr初始化之。
&
是DCD的同义词。
DCDU
用于分配一段字内存单元(分配的内存不是严格字对齐的),并用伪操作中的expr初始化之。
DCDO
用于分配一段字内存单元(分配的内存都是字对齐的),并将个字单元的内容初始化为expr标号基于静态基址寄存器R9的偏移量
DCFD
DCFD用于为双精度的浮点数分配字对齐内存单元,并将个字单元的内容初始化为fpliteral表示的双精度浮点数。
每个双精度的浮点数占据两个字单元。
DCFD与DCFDU不同之处在于DCFDU分配的内存单元并严格字对齐。
DCFDU
DCFS
DCFS用于为单精度的浮点数分配字对齐内存单元,并将个字单元的内容初始化为fpliteral表示的单精度浮点数。
每个双精度的浮点数占据1个字单元。
DCFS与DCFSU不同之处在于DCFDU分配的内存单元并严格字对齐。
DCFSU
DCI
用于分配一段字内存单元(字对齐),并用expr将其初始化
DCQ
DCQ用于分配一段以8个字节为单元的内存(字对齐),并用伪操作中的literal初始化。
DCQU与DCQ的不同之处在于DCQU分配的内存单元并严格字对齐。
DCQU
DCW
DCW用于分配一段半字内存单元(字对齐),并用伪操作中的expr初始化。
DCWU分配的内存单元不严格对齐。
DCWU
汇编控制伪操作
IF
IF,ELSE及ENDIF伪操作能够根据条件把一段源代码包括在汇编程序内或者将其排除在程序外。
[是IF的同义词,|是ELSE同义词,]是ENDIF的同义词。
语法格式
IFlogicalexpression
Instructionorderectives
{ELSE
Instructionorderectives
ENDIF
ELSE伪操作可选。
ELSE
WHILE
WHILElogicalexpression
Instructionsorderectives
WEND
WEND
MACRO
MACRO标识宏定义的开始,MEND标识宏定义的结束。
用MACRO及MEND定义一段代码,称为宏定义体。
[$lable]macroname{$parameter{,$parameter}……}
……
MEND
其中$lable在宏指令被展开时,l