《深入浅出嵌入式底层软件开发》—1. ARM汇编编程基础
1.1 ARM CPU寄存器
ARM的汇编编程,本质上就是针对CPU寄存器的编程,所以要搞清楚ARM有哪些寄存器;ARM寄存器分为两类:普通寄存器和状态寄存器;普通寄存器一共有16个,分别为R0——R15,状态寄存器有2个,分别为CPSR和SPSR。
R15别名PC(program Counter),中文称程序计数器,它的值是当前正在执行的指令在内存中的位置,而当指令执行结束后,CPU硬件会自动将PC值加1,使PC指向下一条即将执行的指令,因此,当对PC寄存器赋值时,也就相当于完成了一次无条件跳转;
R14别名LR(Linked Register),中文称为链接寄存器,用于存放子程序的返回地址,与子程序调用密切相关,下面用例子说明LR如何被使用
汇编器会将例子中的第4行编译为指令:BL addsub,将11行编译为:MOV pc,lr;其中,BL addsub会完成两件事:
1)将子程序的返回地址(也就是第5行代码在内存中的位置)保存到寄存器LR中;
2)跳转到子程序addsub的第一条指令处,完成了子程序的调用;
而指令MOV pc, lr 则将保存在LR中的返回地址赋给PC,这样就完成了从子程序的返回。
如果我们调用的子程序又调用了孙子程序,该怎么办?如果我们写的是C程序,就完全不用管,因为编译器为我们提供了方案:编译器会在孙子程序的入口处增加入栈操作,将LR的值入栈,然后在孙子程序的返回处增加出栈操作,将LR的值恢复;如果编写汇编程序,一定要在子程序的入口处保存LR寄存器的值。
R 13 别名SP(stack pointer),中文名称栈指针寄存器,它是用来存放堆栈的栈顶地址的,也就是说,每次进行出栈和入栈的时候,都将根据该寄存器的值来决定访问内存的位置。32位ARM指令集中没有专门的入栈和出栈指令,所以并不是一定要用SP来作为栈指针寄存器,除了PC外,任何了普通寄存器都可以作为栈指针寄存器,只不过约定俗成都是用SP罢了。
R0——R12是普通寄存器,可以用于任何地方。
状态寄存器CPSR(Current Program Status Register)中文名称 当前程序状态寄存器,也就是说它是用于保存程序的当前状态的,如下图
1)条件代码标志位,它们是ARM指令条件执行的依据
① N:运算结果的最高位反映在该标志位:对于有符号二进制补码,结果<0,N =1;结果>=0, N = 0;
② Z:指令结果为0时,Z =1,(通常表示结果“相等”),否则 Z = 0;
③ C:当进行加法运算并且最高位产生进位时C=1,否则,C =0;减法产生借位C=0,否则C=1;移位操作C表示从最高位最后移出的值,其他指令C通常不变
④ V:当进行加减法运算,并且发生有符号溢出时 V =1,否则 V =0
2)控制位,它们将控制CPU是否响应中断
I:中断禁止位,当I位为1时,IRQ中断被禁止
F:快中断禁止位,当F为1时,FIQ中断被禁止
T:反映了CPU当前状态,当T为1时,处理器运行在Thumb状态下,当T为0时,运行在ARM状态
3)模式位,包括M4,M3,M2, M1,M0,这些位决定了处理器的模式,总共有7种模式:用户、快中断、中断、管理、中止、未定义、系统
SPSR(Saved Program Status Register)中文名称:保存的程序状态寄存器,该寄存器的结构和CPSR完全一样,在异常发生时,由硬件自动将异常前的CPSR的值存放到SPSR中,以便将来在异常处理结束后,程序能恢复原来CPSR的值
1.2 流水线对PC的值的影响
从图中可以看出CPU内部主要有3部分:指令寄存器、指令译码器、指令执行单元(包括ALU和通用寄存器组)。CPU在执行一条指令的时候,主要有3个步骤:取指(将指令从内存或指令cache中取入指令寄存器),译码(指令译码器对指令寄存器的指令进行译码操作,从而辨识出该指令时要执行add还是sub,或是其他操作,从而产生各种时序控制信号),执行(指令执行单元根据译码的结果进行运算并保存结果)。CPU串行执行程序会特别慢,因为执行指令的3个步骤占用的CPU硬件完全不同,所以,在对第一条指令进行取指操作的时候,同时可以对第二条指令进行译码操作,对第三条指令进行执行操作,这种并行运行指令的方式称作流水线操作。PC总是指向“正在取指”的指令,而不是指向“正在执行”的指令或正在“译码”的指令。一般来说,人们习惯性约定将“正在执行的指令作为参考点”,称之为当前第一条指令,因此PC总是指向第三条指令。当ARM状态时,每条指令为4字节长,所以PC始终指向该指令地址加8字节的地址,即:PC值=当前程序执行位置+8;
《深入浅出嵌入式底层软件开发》—1. ARM汇编编程基础的更多相关文章
- ARM汇编编程基础之一 —— 寄存器
ARM的汇编编程,本质上就是针对CPU寄存器的编程,所以我们首先要弄清楚ARM有哪些寄存器?这些寄存器都是如何使用的? ARM寄存器分为2类,普通寄存器和状态寄存器 寄存器类别 寄存器在汇编中的名称 ...
- Java Native Interface 基于JNI的嵌入式手机软件开发实例
1.通过JNI和c/c++的库组件.其他代码交互 2.java和c不能互通的原因时数据类型问题 Introduction https://docs.oracle.com/javase/8/docs/t ...
- [IC]浅谈嵌入式MCU软件开发之中断优先级与中断嵌套
转自:https://mp.weixin.qq.com/s?__biz=MzI0MDk0ODcxMw==&mid=2247483680&idx=1&sn=c5fd069ab3f ...
- iOS开发网络篇—网络编程基础
iOS开发网络篇—网络编程基础 一.为什么要学习网络编程 1.简单说明 在移动互联网时代,移动应用的特征有: (1)几乎所有应用都需要用到网络,比如QQ.微博.网易新闻.优酷.百度地图 (2)只有通过 ...
- 用Netty开发中间件:网络编程基础
用Netty开发中间件:网络编程基础 <Netty权威指南>在网上的评价不是很高,尤其是第一版,第二版能稍好些?入手后快速翻看了大半本,不免还是想对<Netty权威指南(第二版)&g ...
- Java开发知识之Java编程基础
Java开发知识之Java编程基础 一丶Java的基础语法 每个语言都有自己的语法规范.例如C++ 入口点是main. 我们按照特定格式编写即可. Java也不例外. Java程序的语法规范就是 Ja ...
- 【嵌入式开发】 ARM 汇编 (指令分类 | 伪指令 | 协处理器访问指令)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42408137 转载请著名出处 本博客相关文档下载 : -- AR ...
- ARM汇编编程概述
1.为什么需要学些汇编指令 2.ARM汇编指令分类 3.汇编程序框架 4.编程准备 +++++++++++++++++++++++++++++++++++ 1.为什么需要学些汇编指令 bootload ...
- 3.1 ARM汇编编程概述
1. 汇编编程 为什么要学习汇编 1). Bootloader初始化 2). Linux kernel 3). 高效 2. ARM汇编分类 1. ARM标准汇编:ARM公司得汇编器适合在Windows ...
随机推荐
- ios 团购分类页面(9宫格)
=-= 命名有些错误,但功能实现,以后注意下命名规范 WJViewGroup.h #import <UIKit/UIKit.h> @interface WJViewGroup : UIVi ...
- Ehcache使用
http://www.360doc.com/content/14/0423/17/16946725_371472946.shtml http://www.myexception.cn/web-appl ...
- 使用MbrFix.exe修复MBR分区表
在卸载linux Ubuntu之前,先修复MBR,然后再删除Linux分区就可以了.而MbrFix.exe 就是这样一个Windows 修复MBR的应用程序软件,MbrFix.exe 不仅支持Wind ...
- lintcode:整数排序||
题目 给一组整数,按照升序排序.使用归并排序,快速排序,堆排序或者任何其他 O(n log n) 的排序算法. 解题 归并排序 public class Solution { /** * @param ...
- Spring学习总结(1)——Spring AOP的概念理解
1.我所知道的aop 初看aop,上来就是一大堆术语,而且还有个拉风的名字,面向切面编程,都说是OOP的一种有益补充等等.一下子让你不知所措,心想着:怪不得 很多人都和我说aop多难多难 .当我看进去 ...
- 用PostGreSQL实现三层(复习)
modal DAL,BLL都是类库的形式 最终结果如下: 数据库代码: -- Table: student -- DROP TABLE student; CREATE TABLE student ( ...
- Java:IO流之转换流
IO流的基本流情况: 字符流: 字符流缓冲区: FileReader BufferedReader FileWriter ...
- ASP.NET 在IIS7.5下自定义404错误页面的方法
.net 4.0 本机调试时一切正常,配置如下 <customErrors redirectMode="ResponseRewrite" mode="On& ...
- BeautifulSoup 安装使用
Linux环境 1. 安装 方法一: 下载:http://www.crummy.com/software/BeautifulSoup/bs4/download/4.2/ 解压:tar -xzvf be ...
- C# 公关类(全)
http://tool.sufeinet.com/CodePreview/CodeView.aspx?action=view&file=FTP/FTPClient.cs