Linux(四)汇编基础知识、为什么要用汇编

为什么要学习汇编

Cortex-A 芯片一上电 SP 指针还没初始化, C 环境还没准备好,所以肯定不能运行 C 代码,必须先用汇编语言设置好 C 环境,比如初始化 DDR、设置 SP指针等等,当汇编把 C 环境设置好了以后才可以运行 C 代码。所以 Cortex-A 一开始肯定是汇编代码,其实STM32 也一样的,一开始也是汇编,以 STM32F103 为例,启动文件startup_stm32f10x_hd.s 就是汇编文件,只是这个文件 ST 已经写好了,我们根本不用去修改,所以大部分学习者都没有深入的去研究。汇编的知识很庞大,本章我们只讲解最常用的一些指令,满足我们后续学习即可。

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

如果大家使用过 STM32 的话就会知道 MDK 和 IAR 下的启动文件 startup_stm32f10x_hd.s其中的汇编语法是有所不同的,将 MDK 下的汇编文件直接复制到 IAR 下去编译就会出错,因为 MDK 和 IAR 的编译器不同,因此对于汇编的语法就有一些小区别。我们要编写的是 ARM汇编,编译使用的 GCC 交叉编译器,所以我们的汇编代码要符合 GNU 语法。

寄存器与寄存器之间的操作指令:MOV(普通寄存器间复制)、MRS(特殊寄存器->普通寄存器)、MSR(普通寄存器->特殊寄存器)

Linux(四)汇编基础知识、为什么要用汇编_第1张图片

存储器与寄存器之间的操作指令:LDR(存储器->寄存器)、STR(寄存器->存储器)

LDR R0, =0x20C4068 /*把0x20C4068地址写入至R0寄存器*/

LDR R1, =0xffffffff  /*把0xffffffff写入至R1寄存器中*/

LDR R1, [R0] 是把RO寄存器存的地址下的数据读到R1寄存器中

STR R1, [R0] 是把R1寄存器中的数据,写入到R0寄存器所保存的地址中去

Linux(四)汇编基础知识、为什么要用汇编_第2张图片

PUSH(压栈) 和 POP(出栈)指令

Linux(四)汇编基础知识、为什么要用汇编_第3张图片

跳转指令

Linux(四)汇编基础知识、为什么要用汇编_第4张图片

算数指令

Linux(四)汇编基础知识、为什么要用汇编_第5张图片

逻辑运算指令

Linux(四)汇编基础知识、为什么要用汇编_第6张图片

总结:

用汇编先准备C语言环境,初始化DDR、初始化SP指针,还要编写类似STM32的startup.s启动文件,这样才能跳转到main函数中。那么我们如何真正使用汇编呢?下一章将介绍,如何使用汇编点亮一个LED。

 

你可能感兴趣的:(linux)