RAM学习笔记.docx

上传人:b****6 文档编号:5804169 上传时间:2023-01-01 格式:DOCX 页数:21 大小:150.61KB
下载 相关 举报
RAM学习笔记.docx_第1页
第1页 / 共21页
RAM学习笔记.docx_第2页
第2页 / 共21页
RAM学习笔记.docx_第3页
第3页 / 共21页
RAM学习笔记.docx_第4页
第4页 / 共21页
RAM学习笔记.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

RAM学习笔记.docx

《RAM学习笔记.docx》由会员分享,可在线阅读,更多相关《RAM学习笔记.docx(21页珍藏版)》请在冰豆网上搜索。

RAM学习笔记.docx

RAM学习笔记

1、Register14:

Thisregisterisusedasthesubroutinelinkregister.ThisreceivesacopyofR15whenaBranchandLink(BL)instructionisexecuted.Restofthetimeitmaybetreatedasageneral-purposeregister.ThecorrespondingbankedregistersR14_svc,R14_irq,R14_fiq,R14_abtandR14_undaresimilarlyusedtoholdthereturnvaluesofR15wheninterruptsandexceptionsarise,orwhenBranchandLinkinstructionsareexecutedwithininterruptorexceptionroutines.

2、Register15:

ThisregisterholdstheProgramCounter(PC).InARMstate,bits[1:

0]ofR15arezeroandbits[31:

2]containthePC.InTHUMBstate,bit[0]iszeroandbits[31:

1]containthePC.

3、Register16ThisregisteristheCPSR(CurrentProgramStatusRegister).Thiscontainsconditioncodeflagsandthecurrentmodebits.

4、_ISR_STARTADDRESS=0x33FFFF00

6、#definepISR_EINT4_7(*(unsigned*)(_ISR_STARTADDRESS+0x30))

5、__inlinevoidClearPending(intbit)

{

registeri;

rSRCPND=bit;

rINTPND=bit;

i=rINTPND;

}

Chapter14Interruptcontroller

F-bitandI-bitofProgramStatusRegister(PSR)

IftheF-bitofPSRissetto1,theCPUdoesnotaccepttheFastInterruptRequest(FIQ)fromtheinterruptcontroller.

Likewise,IfI-bitofthePSRissetto1,theCPUdoesnotaccepttheInterruptRequest(IRQ).So,theinterruptcontrollercanreceiveinterruptsbyclearingF-bitorI-bitofthePSRto0andsettingthecorrespondingbitofINTMSKto0.

 

ARM寄存器

ARM寄存器共有37个寄存器:

31个通用寄存器,包括程序寄存器(PC)。

这些寄存器都是32位的。

6个状态寄存器,32位,目前只是用了其中的12位。

ARM处理器共有7种不同的处理器模式,在每一种处理器的模式中有一组相应的寄存器。

任意模式下,可见的寄存器包括15个通用寄存器(R0~R14)、一个或两个状态寄存器及程序计数器(PC)。

 

通用寄存器可以分为下面3类

1、未备份寄存器(Theunbankedregisters):

R0至R7

2、备份寄存器:

R8至R14

3、程序计数器PC,即R15

R13和R14每个寄存器对应6个不同的物理寄存器,其中的一个是用户模式和系统模式公用的,另外5个对应于其他的5种工作模式。

R13在ARM中常用作栈指针。

R14:

链接寄存器(LinkRegister,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

不相等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

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就从那起的数据传送指令

 

伪操作

符号定义(Symboldefinition)

GBLA

声明一个ARM程序中的全局变量,并将其初始化为0

GBLL

声明一个全局逻辑变量,并将其初始化为{FALSE}

GBLS

声明一个全局串变量,并将其初始化为空串“”

语法格式:

variable

LCLA

声明一个局部算术变量,并将其初始化为0

LCLL

声明一个局部逻辑变量,并将其初始化为{FALSE}

LCLS

声明一个局部串变量,并将其初始化为空串“”

语法格式:

variable

SETA

给一个算术变量赋值

SETL

给一个逻辑变量赋值

SETS

给一个串变量赋值

语法格式:

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

用于声明一个数据缓冲池的开始

语法格式:

LTORG

MAP

用于定义一个结构化的内存表的首地址。

此时,内存表的位置计数器{VAR}设置成该地址值。

是MAP的同义词

语法格式:

MAPexpr{,base-register}

Expr位数字表达式或者是程序中的标号。

当指令中没有base-regisres时,expr即为结构化内存表的首地址。

此时,内存表的位置计数器{VAR}设置成该地址值。

当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

ENDIF

WHILE

语法格式:

WHILElogicalexpression

Instructionsorderectives

WEND

WEND

MACRO

MACRO标识宏定义的开始,MEND标识宏定义的结束。

用MACRO及MEND定义一段代码,称为宏定义体。

语法格式

MACRO

[$lable]macroname{$parameter{,$parameter}……}

……

……

MEND

其中$lable在宏指令被展开时,l

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1