数据和指令类型
ARM 采用的是32位架构.
Byte : 8 bits
Halfword :16 bits (2 byte)
Word : 32 bits (4 byte)大部分ARM core 提供:
ARM 指令集(32-bit)
Thumb 指令集(T变种)(16-bit )Jazelle cores 支持 Java bytecode(J变种,4TEJ)
处理器工作模式
ARM 有7个基本工作模式:
-
User:非特权模式,大部分任务执行在这种模式
正常程序执行的模式 -
FIQ:当一个高优先级(fast)中断产生时将会进入这种模式
(FAST INTERRUPT RQUEST)高速数据传输和通道处理 -
IRQ:当一个低优先级(normal)中断产生时将会进入这种模式
通常的中断处理 -
Supervisor:当复位或软中断指令执行时将会进入这种模式
供操作系统使用的一种保护模式 -
Abort: 当存取异常时将会进入这种模式
虚拟存储及存储保护 -
Undef: 当执行未定义指令时会进入这种模式
软件仿真硬件协处理器 -
System: 使用和User模式相同寄存器集的特权模式
特权级的操作系统任务
寄存器
-
CPSR 程序状态寄存器
-
SPSR(saved program status register)
用于保存CPSR(current program status register)的值,以便异常返回后恢复异常发生时的工作状态。
-
r13 (the stack pointer, sp)
-
r14 (the link register, lr)
-
r15 ( the program counter, pc) 程序指针
当处理器执行在ARM状态:
所有指令 32 bits 宽
所有指令必须 word 对齐(能被4整除)
所以 pc值由bits [31:2]决定, bits [1:0] 未定义 (所以指令不能halfword / byte对齐).当处理器执行在Thumb状态:
所有指令 16 bits 宽
所有指令必须 halfword 对齐(能被2整除)
所以 pc值由bits [31:1]决定, bits [0] 未定义 (所以指令不能 byte对齐).当处理器执行在Jazelle状态:
所有指令 8 bits 宽
处理器执行 word 存取一次取4条指令PC(R15)的值等于当前正在执行的指令地址+8.
异常处理
字节顺序
- 大端:高位地址存储数据的低字节,低位地址存储数据的高字节
- 小端:高位地址存储数据的高字节,低位地址存储数据的低字节
- 如何判断系统是大端还是小端?
bool IsBigEndian()
{
int value = 0x1234;
char lowaddress = *(char*)&value;
if(lowaddress == 0x12)
{
return true;
}
return false;
}