为了正常的体验网站,请在浏览器设置里面开启Javascript功能!
首页 > RAM学习笔记

RAM学习笔记

2013-02-28 15页 doc 394KB 14阅读

用户头像

is_677971

暂无简介

举报
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_i...
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 R14_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] contain 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=0x33FFFF00 6、#define pISR_EINT4_7 (*(unsigned *)(_ISR_STARTADDRESS+0x30)) 5、__inline void ClearPending(int bit) { register i; rSRCPND = bit; rINTPND = bit; i = rINTPND; } Chapter 14 Interrupt controller F-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, 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位,目前只是用了其中的12位。 ARM处理器共有7种不同的处理器模式,在每一种处理器的模式中有一组相应的寄存器。任意模式下,可见的寄存器包括15个通用寄存器(R0~R14)、一个或两个状态寄存器及程序计数器(PC)。 通用寄存器可以分为下面3类 1、 未备份寄存器(The unbanked registers):R0至R7 2、 备份寄存器:R8至R14 3、 程序计数器PC,即R15 R13和R14每个寄存器对应6个不同的物理寄存器,其中的一个是用户模式和系统模式公用的,另外5个对应于其他的5种工作模式。 R13在ARM中常用作栈指针。 R14:链接寄存器(Link Register,LR),在ARM体系中具有下面两种特殊的作用,1、每一种处理器模式自己的物理R14中存放在当前子程序的返回地址。2、当异常中断发生时,该异常模式的特定的物理R14被设置成该异常模式将要返回的地址,对于有些异常模式,R14的值可能与将返回的地址有一个常数的偏移量。R14也可以作为通用寄存器使用 R15:程序计数器,又叫PC。 CPSR:当前程序状态寄存器 N(Negative) 本位设置当前指令运算结果的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 不相等not equal Z=0 0010 CS/HS 无符号数大于等于Carry Set C=1 0011 CC/LO 无符号数小于Carry Clear C=0 0100 MI 负数 Minus N=1 0101 PL 非负数 Plus N=0 0110 VS 上溢出 overflow Set V=1 0111 VC 没有溢出 overflow Clear V=0 1000 HI 无符号数大于 Higher C=1且Z=0 1001 LS 无符号数小于或等于 Lower or Same C=0或Z=1 1010 GE 带符号数大于或等于Greater or equal N=1且V=1,或N=0且V=0 1011 LT 带符号数小于Less then N=1且V=0,或N=0且V=1 1100 GT 带符号数大于Greater Then Z=0且V=N 1101 LE 带符号数小于或等于Less or Equal Z=1或N!=V 1110 AL 无条件执行 Always 1111 NV 该指令从不执行 Never ARMv3之前 未定义 该指令执行结果不可预测 ARMv3及ARMv4 AL 该指令无条件执行 ARMv5以上版本 跳转指令 1、B 跳转指令 2、BL 带返回的跳转指令 3、BLX 带返回和状态切换的跳转指令 4、BX 带状态切换的跳转指令 指令 功能 对CPSR的影响 MOV 传送指令 根据操作结果更新CPSR相应的值 MVN 将表示的数据的反码传送到中,操作结果更新CPSR中相应的条件标志位 ADD 加法指令。将表示的数据与中的值相加,结果保存在中,同时根据操作的结果更新相应的条件标志位 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位乘积结果与中的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位的半字数据读取到指令中的目标寄存器中。并将寄存器的高16位设置成该半字数据的符号位的值。如果指令的内存地址不是半字对齐的,指令会产生不可预知的结果 LDRT 用户模式的字数据读取指令。从内存中将一个32位的字数据读取到指令中的目标寄存器中。如果指令中寻址方式确定的地址不是字对齐的,则从内存中读取的数值要进行循环右移操作,移位的位数为寻址方式确定的地址的bits[1:0]的8倍。这样对于little-endian,指令想读取数据存放在目标寄存器的第8位;对于bit-endian的内存模式,指令要读取的字节数据存放在目标寄存器的bit[31:24](寻址方式确定的地址bit[0]为0或者bits[15: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。当PC包含在LDM指令的寄存器列表中时,指令从内存中读取的字数据将被当做目标地址值,指令执行后程序将从目标地址处开始执行,即实现了跳转操作。 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就从那起的数据传送指令 伪操作 符号定义(Symbol definition) GBLA 声明一个ARM程序中的全局变量,并将其初始化为0 GBLL 声明一个全局逻辑变量,并将其初始化为{FALSE} GBLS 声明一个全局串变量,并将其初始化为空串“” 语法 variable LCLA 声明一个局部算术变量,并将其初始化为0 LCLL 声明一个局部逻辑变量,并将其初始化为{FALSE} LCLS 声明一个局部串变量,并将其初始化为空串“” 语法格式: variable SETA 给一个算术变量赋值 SETL 给一个逻辑变量赋值 SETS 给一个串变量赋值 语法格式: variable expr RLIST 一个通用寄存器列表定义名称 name RLIST {list of registers} CN 为一个协处理器的寄存器定义名称 语法格式:name CN expr. Expr的数值范围为0~15 CP 为一个协处理其定义名称 语法格式:name CP expr. Expr的数值范围为0~15 DN 为一个双精度VFP(向量浮点运算)寄存器定义名称 语法格式:name DN expr. expr的数值范围为0~15 SN 为一个单精度VFP(向量浮点运算)寄存器定义名称 语法格式:name SN expr. expr的数值范围为0~31 FN 为一个FPA寄存器定义名称 语法格式:name FN expr. expr的数值范围为0~7 数据定义伪操作 LTORG 用于声明一个数据缓冲池的开始 语法格式:LTORG MAP 用于定义一个结构化的内存表的首地址。此时,内存表的位置计数器{VAR}设置成该地址值。 是MAP的同义词 语法格式:MAP expr {,base-register} Expr位数字表达式或者是程序中的标号。当指令中没有base-regisres时,expr即为结构化内存表的首地址。此时,内存表的位置计数器{VAR}设置成该地址值。当expr为程序中的标号时,该标号必须是已经定义过的。Base-register为一个寄存器。当指令中包含这一项时,结构化内存表的首地址为expr和base-register寄存器值的和 FILED 用于定义一个结构化内存表中的数据域。#是FILED的同义词。 语法:{lable} FIELD expr 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的同义词。 语法格式 IF logical expression Instruction or derectives { ELSE Instruction or derectives } ENDIF ELSE伪操作可选。 ELSE ENDIF WHILE 语法格式:WHILE logical expression Instructions or derectives WEND WEND MACRO MACRO标识宏定义的开始,MEND标识宏定义的结束。用MACRO及MEND定义一段代码,称为宏定义体。 语法格式 MACRO [$lable] macroname {$parameter {,$parameter}……} …… …… MEND 其中$lable在宏指令被展开时,lable可悲替换成相应的符号,通常是一个标号。在一个符号前使用$表示程序被汇编时将使用相应的值来替代$后的符号。 Macroname为所定义的红的名称。 MEND MEXIT 用于从宏跳转出去 信息伪操作 ASSERT 在汇编译码器对汇编程序的第二遍扫描中,如果其中ASSERTION中条件不成立,ASSERT伪操作将报告错误信息。 INFO 汇编处理器的第一遍或者第二遍扫描时报告诊断信息 OPT 可以在院程序中设置列表选项 TTL 在列表文件的每一项的开头插入一个标,该TTL伪操作将作用在其后的每一页,直到遇到新的TTL伪操作 SUBT 在列表文件的每一项的开头插入一个子标题,该伪操作将作用在其后的每一页,直到遇到新的SUBT伪操作 其他的伪操作 CODE16 告诉汇编器译码器后面的指令序列为16位Thumb指令 CODE32 告诉汇编器译码器后面的指令序列为32位ARM指令 EQU 为数字常量、基于寄存器的值和程序中的标号(基于PC的值)定义一个字符名称,*是EQU的同义词。 AREA 用于定义一个代码段或数据段 语法 AREA sectionname{,attr}{,attr}… 其中,sectionname为定义的代码段或者数据段的名称。Attr是该代码段的属性,下面列举所有可能的属性。 1、 ALLGN=expression。默认情况下,ELF的代码段和数据段是4字节对齐的。Expression可以取0~31的数值。相应的对齐方式为( )字节对齐。 2、 ASSOC=section。指定与本段相关的ELF段。任何时候连接section段也必须包括sectionname段 3、 CODE定义代码段。默认属性为READONLY 4、 COMDEF定义一个通用的段。该段可以包含代码段或者数据。在各源文件中,同名的CODEEF段必须形同 5、COMMON定义一个通用的段。该段不包含任何用户代码和数据,连接器将其初始化为0. 6、DATA定义数据段。默认属性为READWRITE 7、NOINIT指定本数据段仅仅保存了内存单元,而没有将各初始值写入内存单元,或者初始化为0 8、READONLY指定本段为只读 9、READWRITE指定本段为可读可写。 ENTRY 指定程序的入口点 END 告诉汇编译码器已经到了源程序结尾 ALIGN 通过添加补丁字节是当前位置满足一定的对齐方式 EXPORT EXPORT声明一个符号可以被其他文件引用。相当声明了一个全局变量,GLOBAL为它的同义词。 GLOBAL IMPORT 告诉编译器当前符号不是在本源文件中定义的,而是在其他文件定义的,在本源文件中可能引用该符号。 EXTERN 告诉编译器当前符号不是在本源文件中定义的,而是在其他文件定义的,在本源文件中可能引用该符号。 GET INCBIN 将一个文件包含到(INLUDE)当前源文件中,被包含的文件不进行汇编处理。 KEEP 告诉编译器将局部符号包含在目标文件的符号表中 NOFP 禁止源程序包含浮点运算指令 REQUIRE 指定段之间的相互依赖关系 REQUIRE8 指示当前代码中要求数据栈8字节对齐 PRESERVE8 指示当前代码中数据数据栈是8字节对齐的。 RN 为一个特定的寄存器定义名称 ROUT 定义局部变量的有效范围 ARM汇编语言伪指令 ADR 基于PC的地址值或基于寄存器的地址值读取到寄存器中。 ADRL 基于PC的地址值或基于寄存器的地址值读取到寄存器中。它的读值范围比ADR更大。该伪指令在汇编时被译码器替换成两条指令 LDR 将一个32位常数或者一个地址值读取到寄存器中。 语法格式: LDR{cond} register,={expr|label-expr} NOP _1421397445.unknown _1421417232.unknown
/
本文档为【RAM学习笔记】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索