未来的几周将会学习ARM开发相关知识:ARM汇编语言开发;ARM裸机开发;如何在嵌入式上安装操作系统;基于Linux内核的设备驱动开发;
本周主要接触了ARM汇编语言开发。故本次周报主要对汇编语言进行总结汇总。
目录
1)8种工作模式
1.用户模式(usr):User模式
操作系统上 应用程序代码 运行本模式;
2.系统模式(sys):System模式
操作系统 内核源码里,各个系统 调用函数体内,代码 所处的工作模式;
3.管理模式(svc):Supervisor模式
3.1)开机或复位 运行的代码 所处的工作模式;
3.2)软中断异常 的处理代码 所处的工作模式;
4.中断模式(irq):Interrupt模式
中断异常的 处理代码 所处的工作模式;
中断是一种硬件通知机制;
5.快速中断模式(fiq):Fast-Interrupt模式
快中断异常的 处理代码 所处的工作模式;
快终端也是一种硬件通知机制,但其 响应速度 要比 中断异常 更快;
6.未定义模式(und):undefine模式
当CPU无法正确执行某条指令,会产生未定义指令异常;
未定义指令 异常的 处理代码 所处的工作模式;
7.中止模式(abt):Abort模式
数据终止异常 或 指令预取异常的 处理代码所处的工作模式;
当CPU访问内存时如果出错,会产生 数据中止异常 或 指令预取 异常;
8.监控模式(mon):monitor模式
执行安全监控性质代码时所处的工作模式;
注意:1.第8种是Cortex-A在1-7工作模式上增加的;
2.第3、4、5、6、7五种模式专门用于应对处理异常,因此统一称为:异常模式(即svc、irq、fiq、und、abt);
2)基础知识
2.1)CPSR寄存器
2.2)ARM指令的一般语法形式:
2.3)汇编源码文件的基本构成:
2.4)寻址方式:
3)数据处理类指令
3.1)算术运算指令
加法:
ADD+条件码+S标记 目标寄存器,第一个操作数寄存器,第二个操作数
功能:目标寄存器 = 第一个操作数寄存器的当前值 + 第二个操作数的值
带进位的加法:
ADC+条件码+S标记 目标寄存器,第一个操作数寄存器,第二个操作数
功能:目标寄存器 = 第一个操作数寄存器的当前值 + 第二个操作数的值
减法:
SUB+条件码+S标记 目标寄存器,第一个操作数寄存器,第二个操作数
功能:目标寄存器 = 第一个操作数寄存器的当前值 - 第二个操作数的值
带借位的减法:
SBC+条件码+S标记 目标寄存器,第一个操作数寄存器,第二个操作数
功能:目标寄存器 = 第一个操作数寄存器的当前值 - 第二个操作数的值 - CPSR的C位的反
逆向减法:
RSB+条件码+S标记 目标寄存器,第一个操作数寄存器,第二个操作数
功能:目标寄存器 = 第二个操作数的值 - 第一个操作数寄存器的当前值
带借位的逆向减法:
RSC+条件码+S标记 目标寄存器,第一个操作数寄存器,第二个操作数
功能:目标寄存器 = 第二个操作数的值 - 第一个操作数寄存器的当前值 - CPSR的C位的反
例:
.text
.global _start
_start:
MOV R0,#0XF1000000
MOV R1,#0X10000000
MOV R2,#0XF2000000
MOV R3,#0X20000000
ADDS R4,R0,R2
ADS R5,R1,R3
B.
.end
3.2)位运算(逻辑运算)指令
按位与:
AND+条件码+S标记 目标寄存器,第一个操作数寄存器,第二个操作数
功能:目标寄存器 = 第一个操作数寄存器的当前值 & 第二个操作数的值
按位或:
ORR+条件码+S标记 目标寄存器,第一个操作数寄存器,第二个操作数
功能:目标寄存器 = 第一个操作数寄存器的当前值 | 第二个操作数的值
按位异或:
EOR+条件码+S标记 目标寄存器,第一个操作数寄存器,第二个操作数
功能:目标寄存器 = 第一个操作数寄存器的当前值 ^ 第二个操作数的值
位清除:
BIC+条件码+S标记 目标寄存器,第一个操作数寄存器,第二个操作数
功能:第二个操作数的值中哪些位是1,就将第一个操作数寄存器当前值中的对应位置置0,结果存放到目标寄存器中
相当于:目标寄存器 = 第一个操作数寄存器的当前值 & (~第二个操作数的值)