计算机原理与嵌入式系统笔记:第二篇
ARM指令系统
本课程讲解内容主要基于ARM7处理器
概述
记一下ARM的处理器组成
[{"url":"https://webp.esing.dev/img/image-20240422202917823_2024-4-22_2029_pcgei6p5p3.png","alt":"ARM处理器组成1"},{"url":"https://webp.esing.dev/img/image-20240422202940202_2024-4-22_2029_t8ve74awlo.png","alt":"ARM处理器组成2"}]
编程模型
什么是编程模型?
编程模型(Programming Model) 是所有用户可见的寄存器的集合。
用户级程序使用的寄存器:
- 15个通用32位寄存器(r0~r14)
- 1个程序计数器PC(r15)
- 1个当前状态寄存器(CPSR,Current Program Status Register)
r0-r3
用于参数传入。如果需要的参数超过4个,则将被置于栈中r11
为帧指针寄存器(Frame Pointer, FP)
r13
为栈指针寄存器(Stack Pointer, SP)
r14
为链接寄存器(Link Register, LR)
r15
为程序计数器(Program Counter, PC)
处理器模式
- 用户模式:正常的程序执行状态
- 系统模式:运行具有特权的操作系统任务
- FIQ 模式(Fast Interrupt Request):用于支持高速数据传输或通道处理
- IRQ 模式(Interrupt Request):用于通用中断处理
- SVC 模式(Supervisor):用于操作系统的保护模式
- ABT 模式(Abort):在一个数据或指令预取异常终止的时候进入的模式
- UND 模式(Undefined):在执行了一个未定义的指令的时候进入的模式
ARM处理器模式由CPSR寄存器的mode[4:0]
控制。
异常模式
异常类型 | 处理器模式 | 异常向量地址 | 优先级 |
---|---|---|---|
复位 | 管理 | 0×00000000 | 1 |
未定义指令 | 未定义 | 0×00000004 | 7 |
软件中断 | 管理 | 0×00000008 | 6 |
预取中止 | 中止 | 0×0000000C | 5 |
数据中止 | 0×00000010 | 2 | |
中断IRQ | 中断 | 0×00000018 | 4 |
快中断FIQ | 快中断 | 0×0000001C | 3 |
关于中断
收到中断请求之后,处理器暂停执行当前程序,转而执行中断服务程序,处理完毕后再返回到程序断点处,继续执行原来的程序。
各模式下的寄存器
记一记,很容易搞混
- R0~R7:保存数据或地址值的通用寄存器
- R8~R14和SPSR:取决于当前的处理器模式
- R8~R12有2组不同的物理寄存器:一组用于除FIQ模式之外的所有寄存器模式(R8~R12),另一组用于FIQ模式(R8_fiq~R12_fiq);
- R13和R14分别有6个不同的物理寄存器:1个是用户模式和系统模式公用,其余5个分别对应于其他5种异常模式。
- SPSR有5个不同的物理寄存器:分别对应于其他5种异常模式,注意用户模式和系统模式下没有该寄存器。
异常
当出现异常时,异常模式的R14和SPSR寄存器用于保存状态。
当ARM处理器遇到一条自己和系统内协处理器都无法处理的指令时,这时将产生未定义指令异常中断。从未定义指令异常状态返回时,处理器执行下面的指令:
MOVS PC, R14_und
练习
[{"url":"https://webp.esing.dev/img/image-20240422213247674_2024-4-22_2132_bbc9l1vy7k.png","alt":""},{"url":"https://webp.esing.dev/img/image-20240422213344797_2024-4-22_2133_g6eviivoj8.png","alt":""},{"url":"https://webp.esing.dev/img/image-20240422213445326_2024-4-22_2134_ce9hlv0ksn.png","alt":""}]
答案
- D
- CE
- B
CPSR
- N:当用两个补码表示的带符号数进行运算时,N=1表示运算的结果为负数;N=0表示运算的结果为正数或零。
- Z:Z=1表示运算结果为零;Z=0表示运算结果为非零。
- C:可以有4种方法设置C的值
- 加法运算(包括CMN):产生进位C=1,否则C=0。
- 减法运算(包括CMP):产生借位C=0,否则C=1。
- 包含RRX的非加/减运算指令:C为移出值的最后一位。
- 对于其他非加减运算指令,C值通常保持不变。
- V:当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出。对于其他非加减运算,V的值通常保持不变。
NZ较简单,略过。
进位 C
1 | mov w0,#0xaa ; w0的最高位为1 |
将减法转换成加法后运算。
C标志位可理解为两无符号数相加时,有进位则C=1。
溢出 V
对2进制补码表示的有符号数的加/减运算的溢出判断:
- 两个正数(MSB都是0)相加,结果为一个负值(MSB为1)
- 两个负数(MSB都是1)相加,结果为一个正值(MSB为0)
处理器对两个操作数进行运算时,按照无符号数求得结果,并相应设置进位标志C;根据是否超出有符号数的范围设置溢出标志V。
练习
[{"url":"https://webp.esing.dev/img/image-20240422215153199_2024-4-22_2151_b2aqsajfae.png","alt":""},{"url":"https://webp.esing.dev/img/image-20240422215205430_2024-4-22_2152_j1edouq89s.png","alt":""}]
答案
-
A
-
C
1
2
3
4
50x 7fffffff 正数,最高位为0,0111
+ 0x 00000001
---------------
0x 8ffffff0 最高位溢出,符号位变成1(有符号)
但最高位为0+1=1,未进位(无符号)
存储器系统
- 标准的ARM字是32位长,每个字分为4个8位字节,或2个16位半字。
- 字总是以4字节边界对准,半字则以偶数字节的边界对准。
- ARM允许按字节寻址,每个地址对应一个字节,而不是一个字。
- ARM使用232个8位字节的地址空间,字节地址从0到232-1
大小端
- 大端存储中,数据的高位字节(最高有效字节)保存在内存的低地址处,而低位字节(最低有效字节)保存在高地址处。
- 小端存储中,数据的低位字节保存在内存的低地址处,而高位字节保存在高地址处。
对于半字,寻址需要和两字节进行对齐。
1 | | Addr. | Cont. | Addr. | Cont. | |
[{"url":"https://webp.esing.dev/img/image-20240422220856471_2024-4-22_2209_vg2tqm7clc.png","alt":""},{"url":"https://webp.esing.dev/img/image-20240422220917606_2024-4-22_2209_2c6c0ulgf4.png","alt":""}]
答案
1 | 0x4003 0x4002 0x4001 0x4000 | C |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Esing的小站!
评论
WalineGitalk