一、ARM汇编基础
Q: linux驱动开发为什么需要汇编?

A: 因为 Cortex-A芯片一上电 SP指针还没初始化, C环境还没准备好,所以肯定不能运行 C代码,必须先用汇编语言设置好 C环境,比如初始化 DDR、设置 SP指针等等,当汇编把 C环境设置好了以后才可以运行 C代码。所以 Cortex-A一开始肯定是汇编代码,其实 STM32也一样的,一开始也是汇编,以 STM32F103为例,启动文件startup_stm32f10x_hd.s就是汇编文件,只是这个文件 ST已经写好了,我们根本不用去修改

Q: 汇编代码需要准备的C语言环境是什么?

A: 语言环境准备好。所谓的 C语言环境就是保证 C语言能够正常运行。 C语言中的函数调用涉及到出栈入栈,出栈入栈就要对堆栈进行操作,所谓的堆栈其实就是一段内存,这段内存比较特殊,由 SP指针访问, SP指针指向栈顶。芯片一上电 SP指针还没有初始化,所以 C语言没法运行,对于有些芯片还需要初始化 DDR,因为芯片本身没有 RAM,或者内部 RAM不开放给用户使用,用户代码需要在DDR中运行,因此一开始要用汇编来初始化 DDR控制器。

Q: 常用汇编指令

A: 因使用汇编地方较少,现总结下常用汇编指令

处理器内部传输指令 :
MOV:将数据从一个寄存器传递到另外一个寄存器。
例:MOV R0 R1 @将寄存器 R1中的数据传递给 R0,即 R0=R1
MOV R0, #0X12 @将立即数 0X12 传递给 R0寄存器,即 R0=0X12

MRS:将特殊寄存器 (如 CPSR和 SPSR)中的数据传递给通用寄存器,要读取特殊
寄存器的数据只能使用 MRS指令!
例:MRS R0, CPSR @将特殊寄存器 CPSR里面的数据传递给 R0,即 R0=CPSR

MSR:MSR指令和 MRS刚好相反, MSR指令用来将普通寄存器的数据传递给特殊寄存器,也就
是写特殊寄存器,写特殊寄存器只能使用 MSR
例:MSR CPSR, R0 @将 R0中的数据复制到 CPSR中,即 CPSR=R0

存储器访问指令:
ARM不能直接访问存储器,比如 RAM中的数据,I.MX6UL中的寄存器就是 RAM类型的,我们用汇编来配置 I.MX6UL寄存器的时候需要借助存储器访问指令,一般先将要配置的值
写入到 Rx(x=0~12)寄存器中,然后借助存储器访问指令将 Rx中的数据写入到 I.MX6UL寄存器中。读取I.MX6UL寄存器也是一样的,只是过程相反。常用的存储器访问指令有两种:寄存器也是一样的,只是过程相反。常用的存储器访问指令有两种:LDR和和STR

LDR:LDR最常用的就是读取 CPU的寄存器值
例:LDR R0, =0X0209C004 @将寄存器地址0X0209C004加载到R0中,即R0=0X0209C004
LDR R1, [R0] @读取地址0X0209C004中的数据到R1寄存器中

STR:STR就是将数据写入到存储器中
例: LDR R0, =0X0209C004 @将寄存器地址0X0209C004加载到R0中,即R0=0X0209C004
LDR R1, =0X20000002 @R1保存要写入到寄存器的值,即R1=0X20000002
STR R1, [R0] @将R1中的值写入到R0中所保存的地址中
压栈和出栈指令:
我们通常会在 A函数中调用 B函数,当 B函数执行完以后再回到 A函数继续执行。要想
再 跳回 A函数以后代码能够接着正常运行,那就必须在跳到 B函数之前将当前处理器状态保存
起来 (就是保存 R0~R15这些寄存器值 ),当 B函数执行完成以后再用前面保存的寄存器值恢复
R0~R15即可。保存 R0~R15寄存器的操作就叫做现场保护,恢复 R0~R15寄存器的操作就叫做
恢复现场。在进行现场保护的时候需要进行压栈 (入栈 )操作,恢复现场就要进行出栈操作。压栈
的指令为 PUSH,出栈的指令为 POP PUSH和 POP是一种多存储和多加载指令,即可以一次
操作多个寄存器数据,他们利用当前的栈指针 SP来生成地址,。PUSH 和POP 的另外一种写法是“STMFD SP!”和“LDMFD SP!”,
例:STMFD SP!,{R0~R3, R12} @R0~R3,R12入栈
STMFD SP!,{LR} @LR入栈
LDMFD SP!, {LR} @先恢复LR
LDMFD SP!, {R0~R3, R12} @再恢复R0~R3, R12

Linux驱动开发-Arm汇编基础插图

Linux驱动开发-Arm汇编基础插图1

欢迎使用66资源网
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
7. 本站有不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!

66源码网 » Linux驱动开发-Arm汇编基础

提供最优质的资源集合

立即查看 了解详情