1、RAM学习笔记1、Register 14: This register is used as the subroutine link register. This receives a copy of R15 when a Branch and Link (BL) instruction is executed. Rest of the time it may be treated as a general-purpose register. The corresponding banked registers R14_svc, R14_irq, R14_fiq, R14_abt and R1
2、4_und are similarly used to hold the return values of R15 when interrupts and exceptions arise, or when Branch and Link instructions are executed within interrupt or exception routines.2、Register 15 :This register holds the Program Counter (PC). In ARM state, bits 1:0 of R15 are zero and bits 31:2 c
3、ontain the PC. In THUMB state, bit 0 is zero and bits 31:1 contain the PC.3、Register 16 This register is the CPSR (Current Program Status Register). This contains condition code flags and the current mode bits.4、_ISR_STARTADDRESS=0x33FFFF006、#define pISR_EINT4_7 (*(unsigned *)(_ISR_STARTADDRESS+0x30
4、)5、_inline void ClearPending(int bit) register i; rSRCPND = bit; rINTPND = bit; i = rINTPND;Chapter 14 Interrupt controllerF-bit and I-bit of Program Status Register (PSR)If the F-bit of PSR is set to 1, the CPU does not accept the Fast Interrupt Request (FIQ) from the interrupt controller.Likewise,
5、 If I-bit of the PSR is set to 1, the CPU does not accept the Interrupt Request (IRQ). So, the interrupt controller can receive interrupts by clearing F-bit or I-bit of the PSR to 0 and setting the corresponding bit of INTMSK to 0.ARM寄存器ARM寄存器共有37个寄存器:31个通用寄存器,包括程序寄存器(PC)。这些寄存器都是32位的。6个状态寄存器,32位,目前只
6、是用了其中的12位。ARM处理器共有7种不同的处理器模式,在每一种处理器的模式中有一组相应的寄存器。任意模式下,可见的寄存器包括15个通用寄存器(R0R14)、一个或两个状态寄存器及程序计数器(PC)。通用寄存器可以分为下面3类1、 未备份寄存器(The unbanked registers):R0至R72、 备份寄存器:R8至R143、 程序计数器PC,即R15R13和R14每个寄存器对应6个不同的物理寄存器,其中的一个是用户模式和系统模式公用的,另外5个对应于其他的5种工作模式。R13在ARM中常用作栈指针。R14:链接寄存器(Link Register,LR),在ARM体系中具有下面两种
7、特殊的作用,1、每一种处理器模式自己的物理R14中存放在当前子程序的返回地址。2、当异常中断发生时,该异常模式的特定的物理R14被设置成该异常模式将要返回的地址,对于有些异常模式,R14的值可能与将返回的地址有一个常数的偏移量。R14也可以作为通用寄存器使用R15:程序计数器,又叫PC。CPSR:当前程序状态寄存器N(Negative)本位设置当前指令运算结果的bit31的值。当两个补码表示的有符号数运算时,N=1表示运算结果为负数,N=0表示运算结果为正数或零Z(zero)Z=1表示运算结果为零,Z=0表示运算结果不为零。对于CMP指令,Z=1表示两个数大小相等C(carry)1、 在加法指
8、令中(包括CMN)当结果产生了进位,则C=1,表示无符号数运算发生上溢出,其他情况C=02、 在减法指令中(包括CMP),当运算发生借位,则C=0,表示无符号数运算发生下溢出,其他情况C=13、 对于包含移位操作的非加减运算指令,C包含最后一次溢出的位的数值。4、 对于其他非加减法运算指令,C位的值通常不受影响V(oVerflow)对于加减法运算指令,当操作和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出,通常其他的指令不影响V位QII=1时禁止IRQ中断FF=1时禁止FIQ中断TT=0表示执行ARM指令,T=1表示执行Thumb指令。M3:0控制处理器模式。SPSR:备份程序寄
9、存器。当特定的异常中断发生时,这个寄存器用于存放当前程序状态寄存器的内容。在异常中断程序退出时,可以用SPRS中保存的值来恢复CPSR。ARM指令的分类及其寻址方式ARM指令集可以分为:跳转指令、数据处理指令、程序状态寄存器(PSR)传输指令、Load/Store指令、协处理器指令和异常中断产生指令6类Load指令用于从内存中读取数据放入寄存器中,Store用于将寄存器的数据保存到内存中。指令条件码条件码条件码助记符含义CPSR中条件标志位置0000EQ相等(Equal)Z=10001NE不相等not equalZ=00010CS/HS无符号数大于等于Carry SetC=10011CC/LO
10、无符号数小于Carry ClearC=00100MI负数 MinusN=10101PL非负数 PlusN=00110VS上溢出 overflow SetV=10111VC没有溢出 overflow ClearV=01000HI无符号数大于 HigherC=1且Z=01001LS无符号数小于或等于 Lower or SameC=0或Z=11010GE带符号数大于或等于Greater or equalN=1且V=1,或N=0且V=01011LT带符号数小于Less thenN=1且V=0,或N=0且V=11100GT带符号数大于Greater ThenZ=0且V=N1101LE带符号数小于或等于L
11、ess or EqualZ=1或N!=V1110AL无条件执行 Always1111NV该指令从不执行 NeverARMv3之前未定义该指令执行结果不可预测ARMv3及ARMv4AL该指令无条件执行ARMv5以上版本跳转指令1、B 跳转指令2、BL 带返回的跳转指令3、BLX 带返回和状态切换的跳转指令4、BX 带状态切换的跳转指令指令功能 对CPSR的影响MOV传送指令根据操作结果更新CPSR相应的值MVN将表示的数据的反码传送到中,操作结果更新CPSR中相应的条件标志位ADD加法指令。将表示的数据与中的值相加,结果保存在中,同时根据操作的结果更新相应的条件标志位ADC带位加法。将表示的数据
12、与中的值相加,再加上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_op
13、erand表示的值减去Rn的值,再减去C条件标志位的反码,结果送回Rd。操作结果更新CPSRAND逻辑与。Shifter_operand表示的值与寄存器Rn的值按位做逻辑与操作,结果送回Rd,操作结果更新CPSRORR逻辑或。Shifter_operand表示的值与寄存器Rn的值按位做逻辑或操作,结果送回Rd,操作结果更新CPSREOR异或。Shifter_operand表示的值与寄存器Rn的值按位做逻辑异或操作,结果送回Rd,操作结果更新CPSRBIC位清处。寄存器Rn的值与Shifter_operand表示的值的反码按位做逻辑与操作,结果送回Rd,操作结果更新CPSRCPM比较指令。Rn中
14、的值减去shifter_operand中的值,根据操作结果更新CPSRCMN基于相反数的比较指令。Rn的值加上shifter_operand的数值,根据操作结果更新CPSRTST位测试。Shifter_operand的值与Rn的值按位做与操作,根据结果更新CPSRTEQ相等测试指令。Shifter_operand的值与Rn按位做异或操作,根据结果更新CPSR移位指令ASR算数右移LSL逻辑左移LSR逻辑右移ROR循环右移RRX扩展的循环右移乘法指令MUL32位乘法。实现两个32的数(无符号/有符号数)的乘积,结果放到一个32位寄存器中,根据结果设置CPSRMLA32位带加数的乘法指令。将两个3
15、2位的数(无符号/与符号)的乘积,再将乘积加上第3个操作数,并将结果存放到一个32位的寄存器中,根据运算结果更新CPSRSMULL64位有符号数乘法指令。将两个32位有符号的数的相乘,结果的高32位放到一个32位的寄存器中,低32位放到另一个寄存器中,更新SMLAL64位带加数的有符号数乘法。将两个32位的有符号数的64位乘积结果与和中的64位数相加,结果的告32位存放到一个32位寄存器中,低32位存放到另一个32位寄存器,更新CPSRUMULL64位无符号数乘法指令。将两个32的有符号数的乘积的高32位存放到一个32位的寄存器中,低32位放到另一个寄存器中,更新CPSRUMLAL64位带加数
16、的无符号数乘法指令。将两个32位的无符号数的64位乘积结果与和中的64位无符号数相加,加法结果的告32位存放到一个32位的寄存器中,乘积结果的低32位放到另一个寄存器中。更新CPSR状态寄存器访问指令MRS状态寄存器到通用寄存器的传送指令。MSR通用寄存器到状态寄存器的传送指令。Load/Store内存访问指令LDR字数据读取指令。从内存中将一个32位的字读取到指令中的目标寄存器中。如果指令中寻址方式确定的地址不是字对齐的,则从内存中读取的数值要进行循环右移操作,移位的位数为寻址方式确定的地址的bits1:0的8倍。这样对于little-endian,指令想读取数据存放在目标寄存器的第8位;对
17、于bit-endian的内存模式,指令要读取的字节数据存放在目标寄存器的bit31:24(寻址方式确定的地址bit0为0或者bits15:8寻址方式确定的地址为1)LDRB字节数据读取指令.从内存中将一个8位的字节数据读取到指令中的目标寄存器中。并将寄存器的高24位清零LDRBT用户模式的字节数据读取指令。从内存中将一个8为的字节数据读取到指令中的目标寄存器中。并将寄存器的高24位清零。当在特权级的处理器模式下使用本指令时,内存系统将该操作当做一般用户模式下的内存访问操作。LDRH半字数据读取指令。从内存中将一个16位的半字数据读取到指令中的目标寄存器中。并将寄存器的高16位清零。如果指令的内
18、存地址不是半字对齐的,指令会产生不可预知的结果LDRSB有符号的字节数据读取指令。从内存中将一个8位字节数据读取到指令中的目标寄存器中。并将寄存器高24位设置成该字节数据的符号位的值(即将该8位字节数据进行符号位扩展,生成32位字数据)LDRSH有符号的半字数据读取指令。从内存中将一个16位的半字数据读取到指令中的目标寄存器中。并将寄存器的高16位设置成该半字数据的符号位的值。如果指令的内存地址不是半字对齐的,指令会产生不可预知的结果LDRT用户模式的字数据读取指令。从内存中将一个32位的字数据读取到指令中的目标寄存器中。如果指令中寻址方式确定的地址不是字对齐的,则从内存中读取的数值要进行循环
19、右移操作,移位的位数为寻址方式确定的地址的bits1:0的8倍。这样对于little-endian,指令想读取数据存放在目标寄存器的第8位;对于bit-endian的内存模式,指令要读取的字节数据存放在目标寄存器的bit31:24(寻址方式确定的地址bit0为0或者bits15:8寻址方式确定的地址为1)。当在特权级的处理器模式下使用本指令时,内存系统将该操作当做一般用户模式下的内存访问操作。STR字数据写入指令。用于将一个32位的字数据写入到指令中指定的内存单元。STRB字节数据写入指令。用于将一个8位的字节数据写入到指令中指定的内存单元,该字节数据为指令存放源操作数的寄存器的低8位。STR
20、BT用户模式字节数据写入指令。将一个8位的字节数据写入到指定的内存中。当在特权级的处理器模式下使用本指令时,内存系统将该操作当做一般用户模式下。STRH半字数据写入指令。用于将一个16位的字节数据写入到指令中指定的内存单元,该半字数据为指令存放源操作数的寄存器的低16位。STRT用户模式字数据写入指令。将一个32位的字数据写入到指定的内存中。当在特权级的处理器模式下使用本指令时,内存系统将该操作当做一般用户模式下。批量Load/Store内存访问指令LDM(1)批量内存字数据读取指令。将数据从连续的内存单元中读取到指令中寄存器列表中各寄存器中。它主要用于块数据的读取、数据栈操作以及子程序中返回
21、的操作。当PC包含在LDM指令的寄存器列表中时,指令从内存中读取的字数据将被当做目标地址值,指令执行后程序将从目标地址处开始执行,即实现了跳转操作。LDM(2)用户模式的批量内存字数据读取指令。将数据从连续的内存单元中读取到指令中寄存器列表中各寄存器中。它主要用于块数据的读取、数据栈操作以及子程序中返回的操作。PC寄存器不能包含在LDM指令的寄存器列表中。当在特权级的处理器模式下使用本指令时,内存系统将该操作当做一般用户模式下。LDM(3)带状态寄存器的批量内存字数据读取指令。将数据从连续的内存单元中读取到指令中寄存器列表中各寄存器中。它同时将当前处理器模式的SPSR寄存器的内容复制到CPSR
22、。当PC包含在LDM指令的寄存器列表中时,指令从内存中读取的字数据将被当做目标地址值,指令执行后程序将从目标地址处开始执行,即实现了跳转操作。STM(1)批量内存字数据写入指令。将指令中寄存器列表中的各寄存器值写入到连续的内存单元中。它主要用于块数据的写入、数据栈操作以及进入子程序时保存相关的寄存器的操作。STM(2)用户模式的批量内存字数据写入指令。将指令中寄存器列表中的各寄存器(用户模式对应的寄存器)值写入到连续的内存单元中。它主要用于块数据的写入、数据栈操作以及进入子程序时保存相关的寄存器的操作。信号量操作指令SWP交换指令。将一个内存字单元(该单元地址放在寄存器Rn中)的内容读取到一个
23、寄存器Rd中,同时将另一个寄存器Rm的内容写入到该内存单元中。当Rd和Rm为同一个寄存器时,指令交换该寄存器和内存单元的内容。SWPB字节交换指令。将一个内存字节单元(该单元地址放在寄存器Rn中)的内容读取到一个寄存器Rd中,Rd的高24位设置为0,同时将另一个寄存器Rm的低8位内容写入到该内存单元中。当Rd和Rm为同一个寄存器时,指令交换该寄存器低8位和内存单元的内容。异常中断产生指令SWI软中断指令。BKPT断点中断指令。ARM协处理器指令CDP协处理器数据操作指令。是ARM处理器用于通知协处理器执行特定的操作。该操作由协处理器完成。如协处理器不能成功执行该操作,将产生未定义的指令异常操作
24、中断LDC协处理器数据读取指令。从一系列连续的内存单元将数据读取到协处理器寄存器中。如协处理器不能成功地执行该操作,产生未定义指令异常中断。STC协处理器数据写入指令。将协处理器的寄存器中的数据写入到一些列连续的内存单元中,如不能成功执行,产生未定义的指令异常中断。MCRARM寄存器到到协处理器寄存器的数据传送指令。 MRC协处理器寄存器到ARM就从那起的数据传送指令伪操作 符号定义(Symbol definition) GBLA声明一个ARM程序中的全局变量,并将其初始化为0GBLL声明一个全局逻辑变量,并将其初始化为FALSEGBLS声明一个全局串变量,并将其初始化为空串“”语法格式: v
25、ariableLCLA声明一个局部算术变量,并将其初始化为0LCLL声明一个局部逻辑变量,并将其初始化为FALSELCLS声明一个局部串变量,并将其初始化为空串“”语法格式: variableSETA给一个算术变量赋值SETL给一个逻辑变量赋值SETS给一个串变量赋值语法格式: variable exprRLIST一个通用寄存器列表定义名称name RLIST list of registersCN为一个协处理器的寄存器定义名称语法格式:name CN expr. Expr的数值范围为015CP为一个协处理其定义名称语法格式:name CP expr. Expr的数值范围为015DN为一个双精
26、度VFP(向量浮点运算)寄存器定义名称语法格式:name DN expr. expr的数值范围为015SN为一个单精度VFP(向量浮点运算)寄存器定义名称语法格式:name SN expr. expr的数值范围为031FN为一个FPA寄存器定义名称语法格式:name FN expr. expr的数值范围为07数据定义伪操作LTORG用于声明一个数据缓冲池的开始语法格式:LTORGMAP用于定义一个结构化的内存表的首地址。此时,内存表的位置计数器VAR设置成该地址值。是MAP的同义词语法格式:MAP expr ,base-register Expr位数字表达式或者是程序中的标号。当指令中没有ba
27、se-regisres时,expr即为结构化内存表的首地址。此时,内存表的位置计数器VAR设置成该地址值。当expr为程序中的标号时,该标号必须是已经定义过的。Base-register为一个寄存器。当指令中包含这一项时,结构化内存表的首地址为expr和base-register寄存器值的和FILED用于定义一个结构化内存表中的数据域。#是FILED的同义词。语法:lable FIELD exprSPACE用于分配一块内存单元,并用0初始化。%是它的同义词DCB用于分配段字节内存单元,并用伪操作中的expr初始化之。=是它同义词。DCD用于分配一段字内存单元(分配的内存都是字对齐的),并用伪操
28、作中的expr初始化之。&是DCD的同义词。DCDU用于分配一段字内存单元(分配的内存不是严格字对齐的),并用伪操作中的expr初始化之。DCDO用于分配一段字内存单元(分配的内存都是字对齐的),并将个字单元的内容初始化为expr标号基于静态基址寄存器R9的偏移量DCFDDCFD用于为双精度的浮点数分配字对齐内存单元,并将个字单元的内容初始化为fpliteral表示的双精度浮点数。每个双精度的浮点数占据两个字单元。DCFD与DCFDU不同之处在于DCFDU分配的内存单元并严格字对齐。DCFDUDCFSDCFS用于为单精度的浮点数分配字对齐内存单元,并将个字单元的内容初始化为fpliteral表
29、示的单精度浮点数。每个双精度的浮点数占据1个字单元。DCFS与DCFSU不同之处在于DCFDU分配的内存单元并严格字对齐。DCFSUDCI用于分配一段字内存单元(字对齐),并用expr将其初始化DCQDCQ用于分配一段以8个字节为单元的内存(字对齐),并用伪操作中的literal初始化。DCQU与DCQ的不同之处在于DCQU分配的内存单元并严格字对齐。DCQUDCWDCW用于分配一段半字内存单元(字对齐),并用伪操作中的expr初始化。DCWU分配的内存单元不严格对齐。DCWU汇编控制伪操作IFIF,ELSE及ENDIF伪操作能够根据条件把一段源代码包括在汇编程序内或者将其排除在程序外。是IF
30、的同义词,| 是ELSE同义词, 是ENDIF的同义词。语法格式IF logical expressionInstruction or derectives ELSE Instruction or derectivesENDIFELSE伪操作可选。ELSEENDIFWHILE语法格式:WHILE logical expression Instructions or derectives WENDWENDMACROMACRO标识宏定义的开始,MEND标识宏定义的结束。用MACRO及MEND定义一段代码,称为宏定义体。语法格式MACRO$lable macroname $parameter ,$parameterMEND其中$lable在宏指令被展开时,l
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1