一、ARM
1、ARM概述
- ARM 是基于精简指令集的处理器架构(RISC),主要运用于移动设备和嵌入式系统
- CISC:复杂指令集,如Windows x86,功能强大,指令复杂,功耗高
- RISC:精简指令集,高功耗、高性能、低成本
2、ARM工作模式概述
|--------------|------------------------------------------|
| 工作模式 | 简介 |
| 用户模式 | 正常程序执行模式,权限最低 |
| 系统模式 | 特权模式之一,常用作操作系统内核操作 运行操作系统内核任务,与用户模式共用寄存器 |
| 中断模式 | 处理普通中断请求 用于通用外设中断响应 |
| 快速中断模式(FIQ) | 优先级高于普通中断,具有独立寄存器 适用于低延迟中断处理,如高速数据传输 |
| 管理模式(SCV) | 操作系统保护模式,系统复位或执行软中断指令时进入 用于系统调用和特权管理 |
| 终止模式(ABT) | 当发生非法内存访问或数据错误时触发 |
| 未定义指令模式(UND) | 遇到无法识别的指令时进入 |
3、异常向量表
1.概述
- 异常向量表是ARM处理器中一组固定的内存地址,每个地址对应一种异常类型。当异常发生时,处理器会自动跳转到对应的地址执行异常处理程序
- 在启动代码中,异常向量表通常通过汇编指令定义
2.异常处理流程
- 异常触发后,处理器保存当前状态,跳转到对应向量地址执行处理程序
- 处理完成后恢复现场,继续原程序执行
3.七种异常类型
|------------------------------|-----------|
| 类型 | 发生场景 |
| Reset | 系统复位时触发 |
| Undefined Instruction | 执行未知指令时触发 |
| IRQ | 普通中断请求 |
| FIQ | 快速中断请求 |
| Data Abort | 数据访问失败 |
| Prefetch Abort | 指令预取失败 |
| Software Interrupt (SWI) | 软中断指令调用 |
二、汇编语言
1、概述
- 概念:汇编语言是一种面向机器的低级编程语言
- 特点:
- 硬件依赖:不同处理器需使用不同的汇编语言
- 实施高效:直接操作寄存器、内存和I/O端口,生成代码紧凑且执行速度快
- 代码复杂:需手动管理内存和寄存器,代码冗长且调试困难
- 应用领域:嵌入式系统、操作系统与驱动
- 伪操作:写给编译器命令,用于指导编译器如何工作、不是ARM处理器实际的指令
- 立即数:直接嵌入指令中的常数值,用于对寄存器或内存单元赋初值
- 合法立即数编码规则
- 低 8 位存储基数值(0--255),高 4位存储右移位数
- 32位操作数中至少有20位连续为0
- 合法立即数编码规则
2、格式(均为伪操作)
- area:用于定义一个段,程序、数据、堆栈等都需要被组织在不同的段中
- reset:定义字段的名字
- code:指定该段属性的伪代码、意味着字段可执行的指令
- readonly:指定权限为只读
- code32:表示后续指令使用 32位的 ARM 指令集
- thumb: 表示后续指令使用 16位的 Thumb 指令集
area reset, code, readonly
code32
entry ;起点
end ;终点
3、部分指令概述(详细信息可查询相关手册)
1.mov、mvn(寄存器、内存间数据传输指令)
mvn 在 mov 的基础上先按位取反,其余相同,下面以 mov 为例
原型:
1.MOV{S}<c> <Rd>, #<const>
2.MOV{S} <Rd>, <Rm>, <way>#<n>
功能:
1.将立即数加载到指定寄存器中
2.将寄存器<Rm>的值按<way>操作n位后,存入目标寄存器<Rd>中
参数:
{S}(可选):用于指定是否更新APSR中的标志位
<c>(可选):控制指令在特定条件下执行
<Rd>:目标寄存器
<Rm>:源寄存器
#<const>、#<n> :立即数
<way>:数据操作方式
ASR:算数右移
LSL:逻辑左移
LSR:逻辑右移
ROR:循环右移
2.算数运算指令add(加)、sub(减)
以加法为例、减法只需修改指令名、其余不变
原型:
1.add{S}<c> <Rd>, <Rn>, #<const>
2.ADD{S}<c> <Rd>, <Rn>, <Rm>{, <shift>}
功能:
1.将<Rn>寄存器中数据加立即数后的结果存放到<Rd>寄存器中
- 将<Rn>和 <Rm>寄存器中数据求和,存放到<Rd>中
参数:
<Rn>:第一个操作寄存器
<Rm>:第二个操作寄存器
{, <shift>}
(可选) :对<Rm>
应用的移位操作
3.位运算操作 bic (指定为清零)、orr(指定位置一)
以置零为例,置一只需修改指令名、其余不变
原型:
1.BIC{S}<c> <Rd>, <Rn>, #<const>
2.BIC{S}<c> <Rd>, <Rn>, <Rm>{, <shift>}
功能:
将<Rn>中的立即数位置零,存储到<Rd>中
将<Rn>中的<Rm>进行{, <shift>}操作后位 清零
4.比较指令
原型:
1.CMP<c> <Rn>, #<const>
2.CMP<c> <Rn>, <Rm>{, <shift>}
3.CMP<c> <Rn>, <Rm>, <type> <Rs>
功能:
1.比较寄存器<Rn>中数据与立即数的大小
2.比较<Rn>与移位操作后<Rm>的大小
5.跳转指令
原型:
B<c> <label>
功能:
跳转至指定标签位
参数:
<label>:标签名
4、CPSR寄存器中条件判断标志
|----|-------------------------------------------|
| 标志 | 含义 |
| N | 上条指令执行结果最高位bit31为1,则 N = 1 当结果作为有符号解释时为负值 |
| Z | 零值标志位 上条指令执行结果为0,则 Z = 1 |
| C | 进位标志位 如果在加法过程中进位或者减法时没有借位,则为 C = 1 |
| V | 溢出标志位 进行有符号解读,是否发生溢出 |
5、汇编实现C语言语句
1.条件语句:
cs
cmp r0, r1 //比较r0、r1
bge greater
blt less
greater //r0 > r1
b finish
less //r0 < r1
b finish
finish
b finish //死循环
2.循环语句:
cs
mov r0, #0
mov r1, #0 //定义变量
loop //循环
cmp r0, #100
bgt finish //当r0 > 100时退出循环
add r1, r1, r0
add r0, r0, #1
b loop
finish
b finish
3.函数调用:
cs
func
mov r0, #1
mov r1, #2
add r3, r0, r1
bx lr //返回主函数
main
mov r0, #100
mov r1, #200
bl func //函数调用
mov r3, #30