### ARM系列处理器应用技术完全手册第三章:ARM微处理器的编程模型
#### 3.1 数据类型
在ARM体系结构中,数据类型是处理器能够直接处理的信息单位的基础。本章节详细介绍了ARM处理器支持的基本数据类型及其特点。
##### 3.1.1 ARM的基本数据类型
ARM处理器基于32位架构,其支持三种基本数据类型:
1. **Byte (字节)**: 由8位组成。这是最小的数据单位,在ARM体系结构中,字节可以在任何地址位置被访问。
2. **Halfword (半字)**: 包含16位数据,必须在2字节边界上对齐。这意味着半字的起始地址应该是偶数地址。
3. **Word (字)**: 包括32位数据,必须在4字节边界上对齐。这意味着字的起始地址的最后两位应该是00。
**存储器组织**: 存储器被视为一个从0到2^32-1的连续字节序列。每个字节都有一个唯一的地址。图3.1展示了ARM存储器的组织结构,包括字、半字以及它们在存储器中的对齐方式。
- 字占用四个字节的位置,并且从4的倍数的地址开始。
- 半字占用两个字节的位置,并且从偶数地址开始。
值得注意的是:
- ARM v4及以上版本支持这三种数据类型,而v4之前的版本仅支持字节和字。
- 当声明为`unsigned`类型时,N位数据值表示范围为0至2^n-1的非负数。
- 当声明为`signed`类型时,N位数据值表示范围为-2^(n-1)至2^(n-1)-1的整数,使用二进制的补码表示法。
- 所有的数据类型指令的操作数都是以字类型数据处理的。
- Load/Store指令可以用于从存储器读取和写入字节、半字或字数据。加载时会自动进行字节或半字的零扩展或符号扩展。
- ARM指令编译后的大小为4个字节,与字边界对齐;而Thumb指令编译后的大小为2个字节,与半字边界对齐。
##### 3.1.2 浮点数据类型
ARM体系结构支持浮点数据类型,但ARM硬件指令集并未直接定义这类数据类型。ARM公司定义了一系列浮点指令在协处理器指令空间中。这些指令可以通过未定义指令异常在软件中实现,部分指令也可以由浮点运算协处理器FPA10以硬件方式实现。
此外,ARM还提供了一个C语言编写的浮点库作为ARM浮点指令集的替代方案。该库支持IEEE标准的单精度和双精度格式。C编译器可以通过关键字标志选择这个库,这样产生的代码比软件仿真更快更紧凑。
##### 3.1.3 存储器大/小端模式
ARM处理器支持大端模式(big-endian)和小端模式(little-endian)两种内存访问模式。
- **大端模式**: 在大端模式下,高地址处存放的是数据的高位。例如,对于一个32位的数据,最高有效字节将位于较高的内存地址。
- **小端模式**: 在小端模式下,低地址处存放的是数据的低位。对于同一个32位的数据,最低有效字节将位于较低的内存地址。
这两种模式的选择会影响到数据在内存中的存储方式,因此在编写涉及内存访问的代码时需要特别注意。
#### 3.2 处理器工作模式
ARM处理器具有七种不同的工作模式,每种模式都有特定的用途。这些模式包括但不限于:
- **用户模式(User)**: 这是最常用的工作模式,大部分应用程序运行在此模式下。
- **快速中断模式(FIQ)**: 当一个高优先级中断发生时,处理器会切换到此模式。通常用于高速数据传输和通道处理。
- **外部中断模式(Irq)**: 当一个普通优先级中断发生时,处理器会进入此模式。主要用于一般的中断处理。
- **特权模式(Supervisor)**: 当处理器复位或接收到软中断指令时,会进入此模式。
每种工作模式对应不同的应用场景,了解这些模式有助于开发者更好地设计和优化基于ARM的系统。