版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
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个
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 ;从子程序返回