我从内部看ARM

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/lzw508170827/article/details/87905766

ARM家族大检阅

芯片 arm核 指令架构
s3c2440 arm9 arm v4
s3c6410 arm11 arm v6
s5pv210 cortox a8 arm v7

ARM处理器工作模式

Processor mode Mode number Description
User usr 0b10000 Normal program execution mode
FIQ fiq 0b10001 Supports a high-speed data transfer or channel process
IRQ irq 0b10010 Used for general-purpose interrupt handling
Supervisor svc 0b10011 A protected mode for the operating system
Abort abt 0b10111 Implements virtual memory and/or memory protection
Undefined und 0b11011 Supports software emulation of hardware coprocessors
System sys 0b11111 Runs privileged operating system tasks (ARMv4 and above)

linux用户态程序运行中usr模式
linux内核运行在svc模式

ARM寄存器详解

ARM寄存器:37个

在这里插入图片描述

ARM寄存器:37个
通用寄存器:31个
程序状态字寄存器:6个
不分组寄存器:R0-R7
分组寄存器:R7-R14
程序计数器:R15
CPSR
SPSR
CPSR寄存器重要位描述:

在这里插入图片描述

N:当比较两个数字的大小时,当A>B,N保持0,当A < B,N变为1

Z:也是比较两个数,当A、B两者相等时,Z为1

I:当为1时,不能产生IRQ中断

F:当为1时,不能产生FIQ中断

M[4:0]:表明处理器工作不同的模式(可以看上上面的图)

ARM寻址方式

1. 立即数寻址

立即数寻址,是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数。这个操作数被称为立即数,对应的寻址方式也就叫做立即数寻址。例如以下指令:

ADD R0,R0,#0x3f 		;R0←R0+0x3f

在以上两条指令中,第二个源操作数即为立即数,要求以“#”为前缀。

2. 寄存器寻址

寄存器寻址就是利用寄存器中的数值作为操作数,这种寻址方式是一种执行效率较高的寻址方式。

ADD R0,R1,R2 		;R0←R1+R2

该指令的执行效果是将寄存器R1和R2的内容相加,其结果存放在寄存器R0中。

3. 寄存器间接寻址

寄存器间接寻址就是寄存器中的存放的是操作数在内存中的地址。例如以下指令:

LDR R0, [R2] 		;R0← [R2]

在第一条指令中,以寄存器R2的值作为操作数的地址,在存储器中取得一个操作数后与R1相加,结果存入寄存器R0中。第二条指令将以R1的值为地址的存储器中的数据传送到R0中。

4. 基址变址寻址

基址变址寻址就是将寄存器(基址寄存器)里的内容(基地址)与指令中给出的地址偏移量相加,从而得到操作数在内存中的地址:

LDR R0 [R1,  #4] 		;R0←[R1+4]
5. 相对寻址

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

BL NEXT ;跳转到子程序NEXT处执行
……
……
NEXT
……
MOV PC,LR ;从子程序返回

猜你喜欢

转载自blog.csdn.net/lzw508170827/article/details/87905766