LINUX驱动开发学习笔记---ARM汇编基础

最近在学习LINUX驱动开发,记录一下。带着问题来学习,方便以后查阅巩固。

一、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

算数运算指令:在嵌入式开发中最常会用的就是加减指令,乘除基本用不到。
在这里插入图片描述
逻辑运算指令:
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值