ARM寄存器的7种工作模式和几种寻址方式

时间:2021-09-25 18:20:39
ARM寄存器的7种工作模式
CPSR[5:0]
10000 user
10001 FIQ
10010 IRQ
10011 SVC
10111 中止
11011 未定义

11111 系统

用这两个指令读写CPRS的值

msr

mrs

如:

MRS  R1,CPSR ; 将CPSR状态寄存器读取,保存到R1中
MRS  R2,SPSR ; 将SPSR状态寄存器读取,保存到R2中
MSR  R1,CPSR ; 将R1状态寄存器读取,保存到CPSR中
MSR  R2,SPSR ; 将R2状态寄存器读取,保存到SPSR中


工作模式
ARM微处理器支持7种工作模式,分别为:
1、用户模式(Usr)
用于正常执行程序
2、快速中断模式(FIQ)
用于高速数据传输
3、外部中断模式(IRQ)
用于通常的中断处理
4. 管理模式(svc)
操作系统使用的保护模式
5. 数据访问终止模式(abt)
当数据或指令预取终止时进入该模式,可用于虚拟存储及
存储保护。
6. 系统模式(sys)
运行具有特权的操作系统任务。
7. 未定义指令中止模式(und)
当未定义的指令执行时进入该模式,可用于支持硬件

ARM微处理器的运行模式可以通过软件改
变,也可以通过外部中断或异常处理改变。
应用程序运行在用户模式下,当处理器运行
在用户模式下时,某些被保护的系统资源是
不能被访问的。

除用户模式以外,其余的所有6种模式称之为
非用户模式,或特权模式(Privileged 
Modes);其中除去用户模式和系统模式以
外的5种又称为异常模式(Exception 
Modes),常用于处理中断或异常,以及需

要访问受保护的系统资源等情况。


所谓寻址方式就是处理器根据指令中给出的地址信息来寻找物理地址的方式。


立即寻址
立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操
作数本身就在指令中给出,只要取出指令也就取到了操作
数。这个操作数被称为立即数,对应的寻址方式也就叫做
立即寻址。例如以下指令:
ADD R0,R0,#1 ;R0←R0+1
ADD R0,R0,#0x3f ;R0←R0+0x3f
在以上两条指令中,第二个源操作数即为立即数,要求以
“#”为前缀,对于以十六进制表示的立即数,还要求在
“#”后加上“0x”或“&”。


寄存器寻址

寄存器寻址就是利用寄存器中的数值作为操作
数,这种寻址方式是各类微处理器经常采用的
一种方式,也是一种执行效率较高的寻址方
式。
ADD R0,R1,R2 ;R0←R1+R2
该指令的执行效果是将寄存器R1和R2的内容
相加,其结果存放在寄存器R0中。


寄存器间接寻址

寄存器间接寻址就是以寄存器中的值作为操作数的地
址,而操作数本身存放在存储器中。例如以下指令:
ADD R0,R1,[R2] ;R0←R1+[R2]
LDR R0,[R1] ;R0←[R1]
在第一条指令中,以寄存器R2的值作为操作数的地
址,在存储器中取得一个操作数后与R1相加,结果存
入寄存器R0中。第二条指令将以R1的值为地址的存储
器中的数据传送到R0中。


基址变址寻址

基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)
的内容与指令中给出的地址偏移量相加,从而得到一个操作数
的有效地址:
LDR R0,[R1,#4] ;R0←[R1+4]
LDR R0,[R1,#4]! ;R0←[R1+4]、R1←R1+4
LDR R0,[R1] ,#4 ;R0←[R1]、R1←R1+4
LDR R0,[R1,R2] ;R0←[R1+R2]


多寄存器寻址

采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传
送。这寻址方式可以用一条指令完成传送最多16个通用寄存器
的值。以下指令:
LDMIA R0,{R1,R2,R3,R4} 

 ;R1←[R0]
 ;R2←[R0+4]
 ;R3←[R0+8]
 ;R4←[R0+12]
该指令的后缀IA表示在每次执行完加载/存储操作后,R0按字长
度增加,因此,指令可将连续存储单元的值传送到R1~R4。


相对寻址

与基址变址寻址方式相类似,相对寻址以程序计数器PC的当
前值为基地址,指令中的地址标号作为偏移量,将两者相加
之后得到操作数的有效地址。以下程序段完成子程序的调用
和返回,跳转指令BL采用了相对寻址方式:
BL NEXT ;跳转到子程序NEXT处执行
……
NEXT
……
MOV PC,LR ;从子程序返回


堆栈寻址

堆栈是一种数据结构,按先进后出(First In 
Last Out,FILO)的方式工作,使用一个称作堆
栈指针的专用寄存器指示当前的操作位置,堆栈
指针总是指向栈顶。
递增堆栈:向高地址方向生长
递减堆栈:向低地址方向生长
满堆栈:堆栈指针指向最后压入堆栈的有效数据项
空堆栈:堆栈指针指向下一个要放入数据的空位置