2016.4.6 我从内部看ARM课程笔记
1、关于ARM的一些名词:
经常听到一些关于ARM的名词,什么ARM9,ARM11,Cortex-M4……让人有点摸不着头脑。今天听完课程之后,课程对这些名词进行了分类:
a、芯片: S3C6410、2440、210
b、ARM内核: Cortex-A8、ARM9、ARM11
c、指令架构版本:ARMv7、ARMv6
举个例子:
S3C2440是三星公司的一款芯片,该芯片的内核是ARM9,指令架构是ARMv4
S3C6410也是三星公司的一款芯片,该芯片的内核是ARM11,指令架构是ARMv6
210也是一块芯片,该芯片的内核是ARM Cortex-A8,指令架构是ARMv7
2、关于ARM的工作模式:
ARM架构支持7种工作模式:
User usr :一般程序的执行模式,例如linux的用户程序
FIQ fiq:Fast Interrupt Req,快速中断模式,支持高速数据传输
IRQ irq:中断模式,用于一般的中断处理
Superviser svc:用于操作系统的保护模式,例如linux的内核程序就运行在该模式之下
Abort abt
undefined und
System sys:系统模式,只有ARMv4及以上的架构才具有该模式
3、关于ARM的寄存器:
ARM处理器一共有37个寄存器,其中有31个通用寄存器,6个程序状态寄存器。
3.1通用寄存器:
通用寄存器中有R0~R7,共8个不分组寄存器。(They are completely general-purpose registers, with no special uses……)
分组寄存器是R8~R14:(The physical register referred to by each of them depends on the current processor mode。)
上述这句话粗略翻译就是:物理上实际的寄存器是由当前处理器的工作模式决定的。根据处理器的模式不同,这些寄存器又被分为:
R13_svc R14_svc //svc即Superviser模式下的R13和R14
R13_abt R14_abt//abt即abort模式下的R13和R14
R13_und R14_und//und即undefined模式下的R13和R14
R13_irq R14_irq//irq即中断模式下的R13和R14
R8_fiq R9_fiq R10_fiq R11_fiq R12_fiq R13_fiq R14_fiq//快速中断模式下的R13……
以上共计15个,加上User状态下的R8~R14,一共23个寄存器。加上不分组寄存器8个,刚好31个通用寄存器。
3.2程序状态字寄存器:
程序状态寄存器有CPSR,和SPSR。其中CPSR是不分组寄存器,就1个。而SPSR是分组寄存器,根据处理器的不同工作模式,SPSR也是不同的:
SPSR_svc SPSR_abt SPSR_und SPSR_irq SPSR_fiq
所以总共有6个程序状态字寄存器。
3.3 特殊的寄存器:
3.3.1 R14
R14(also known as the Link Register or LR)has two special functions in the architecture:
//R14也被称作连接结存器LR,具有两个特殊的用途:
A、In each mode, the mode's own version of R14 is used to hold subroutine return addresses. When a
subroutine call is performed by a BL or BLX instruction, R14 is set to the subroutine return address. The
subroutine return is performed by copying R14 back to the program counter.
//在处理器的每种工作模式之下,每种模式对应的自己版本的R14被用来保存子程序的返回地址。当通过BL或作BLX指令来调用一个子程序时,就会将该子程序的返回地址放在R14里。子程序通过将R14里面的内容拷贝到PC来实现返回操作。
B、When an exception occurs, the appropriate exception mode's version of R14 is set to the exception
return address (offset by a small constant for some exceptions). The exception return is performed in
a similar way to a subroutine return, but using slightly different instructions to ensure full restoration
of the state of the program that was being executed when the exception occurred.
//当发生异常时,异常返回地址就会被装进和异常模式相对应的R14寄存器。和子程序返回的方式一样,异常的返回也采用相似的方式,但是稍微不同的是采用不同的指令来确保完全恢复程序在异常发生之前的状态。
3.3.2 R15
R15 is used to read or write the Program Counter (PC)
//R15被用来读写程序计数器(PC)
3.3.3 CPSR和SPSR
The Current Program Status Register//当前程序转态寄存器
Saved Program Status Register (SPSR)//备份程序转态寄存器
具体每一位的意义,请参看《ARM Architecture Reference Manual》A2.5
4、关于寻址方式的复习:
寻址方式:就是处理器根据指令中给出的信息来找到指令所需操作数的方式
4.1立即寻址:
一种特殊的寻址方式,操作数本身就在指令中给出。
eg: ADD R0,R0,#0x2f
该指令:将R0里面的数和立即数0x2f相加,然后将结果存放在R0里面。
4.2寄存器寻址方式:
寄存器寻址就是利用寄存器中的数据作为操作数。
eg:ADD R0,R1,R2
该指令:将R1里面的数和R2里面的数相加,然后将结果存放在R0里面。
4.3:寄存器间接寻址:
寄存器间接寻址就是寄存器里面存放的数据是操作数在内存中的地址。
eg: LDR R0,[R2]
该指令:将以R2里面存放的数据为地址的操作数加载到R0里面。
4.4基址变址寻址
基址变址寻址就是将寄存器里的内容(基地址)与指令中给出的地址偏移量相加,从而得到操作数在内存中的地址
eg:LDR R0,[R1,#4]
4.5相对寻址:
与基 址 变 址寻址方式 相类似 , 相对 寻址PC 指针 的 当前值为
基地 址, 指令中 的 地 址 标号作为偏移量 ,将 两 者 相加之后 得
到操作数 的有 效地 址 。 以下程序 段完 成 子 程序 的 调 用 和 返回 ,
跳转 指令BL采 采 用 了相对 寻址方式:
BL NEXT ; 跳转 到 子 程序NEXT处 处 执行
……
NEXT
……
MOV PC ,LR ; 从 子 程序 返回