http://ift.tt/2EiY3sg
ARM 基本约定
- Byte:8 bits
- Halfword: 16bits
- Word:32 bits
大部分的ARM core提供:
- ARM 指令集(32-bit)(中断处理,需要32位)
- Thumb指令集(16-bit)(最先推出的,每个指令16位)
- Thumb2 指令集(16&32bit)(ARMv7时退出,混合指令)
- ARM Thumb 互相可以转换
ARM处理器工作模式(7种)
- 7种工作模式:
Mode | 解释 |
---|---|
User | 非特权模式,大部分任务执行在这种模式 |
FIQ | 当一个高优先级(fast)中断产生时将会进入这种模式(ARM的FIQ Signal被触发所产生的异常) |
IRQ | 当一个低优先级(normal)中断产生时将会进入这种模式(ARM的IRQ Signal被触发所产生的异常 ) |
Supervisor | 当复位或软中断指令执行时将会进入这种模式 |
Abort | 当存取异常时将会进入这种模式(也就是读取内存异常) |
Undef | 当执行未定义指令时进入这种模式 |
System | 使用和User模式相同寄存器集的特权模式 |
- 注意:
1:除User(用户模式)是Normal(普通模式)外,其他6种都是Privilege(特权模式)
2:Privilege中除Sys模式外,其余5种为异常模式
3:各种模式的切换,可以是普通程序员通过代码主动切换(通过写cpsr寄存器);也可以是CPU在某些情况下自动切换
4:各种模式下权限和可以访问的寄存器不同
ARM寄存器
ARM 寄存器一共有37个32位寄存器
其中,30个为”通用“寄存器,r1-r14
- 未分组的寄存器:r1-r7,只有一个寄存器
- 分组的寄存器:
- r8-r14:有多个同名寄存器
- r8-r12:两个
- r13-r14:6个 r13(sp),R14(lr)
- 一个固定的程序计数器:pc(又称r15),也就是x86 中的eip
- 6个状态寄存器:cpsr ,spsr
但是这个37个寄存器是不同同时访问的,一种模式对应一套,规则如下图
Abort Mode
FIQ Mode
IRQ Mode
SVC Mode
Undef Mode
User Mode
- 其中:sp(r13 )- 堆栈指针
- lr(r14)- 连接寄存器,用于保存返回地址
- cpsr - 当前程序的状态寄存器
保存当前程序的种种状态 包括:条件标志位,中断标志位,当前处理器模式等
-
spcr -备份的程序状态寄存器
cpsr寄存器的备份,当异常发生时,spsr用于保存cpsr的当前值,从异常退出时可由spcr来恢复cpsr,用于用户模式与系统模式不属于异常模式,所以没有spcr
例子:
(1)跳转到指定地址
mov pc,lr //直接修改pc,完成跳转
bx lr //跳转到lr保存的地址
(2)在函数入口保存寄存器信息
stmfd sp!,{r11,lr} //保存大括号中的寄存器到栈中,从右往左
(3)使用ldm 指令修改pc,完成函数返回
stmfd sp!,{r11,lr} //保存大括号中的寄存器到栈中,从右往左
小结
- ARM共有37个寄存器,都是32位长度
- 32个寄存器中30个为通用型,一个为固定pc,一共固定用于cpsr,5个固定用作5中异常模式下的spsr
- cpsr中各个bit位表明了cpu的某些状态信息,这些信息是非常重要的
- cpsr 中的I,F 为和开中断,关中断有关,cpsr中的mode位(bit4~bit0共5位)决定了CPU的工作模式, 在uboot代码中会使用汇编进行设置
- pc(Program control register)为程序指针,PC指向哪里,CPU就会执行那条指令,整个cpu中就只有一个PC
The post 32位ARM汇编语言(一)寄存器介绍 appeared first on cole.
http://ift.tt/2DLuJty ArmAsm, ARM, asm January 29, 2018 at 07:44PM
评论
发表评论