《深入浅出嵌入式底层软件开发》—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 ...
随机推荐
- 在线API文档
http://www.ostools.net/apidocs A Ace akka2.0.2 Android Ant Apache CXF Apache HTTP服务器 ASM字节码操作 AutoCo ...
- IE6 png 透明--四种解决方法
FF和IE7已经直接支持透明的png图了,下面这个主要是解决IE6下透明PNG图片有灰底的 方法一:定义一个样式,给某个div应用这个样式后,div的透明png背景图片自动透明了.(注意两处图片的路径 ...
- Mac Air maven 环境配置
mave 的配置 检出项目遇到问题: Could not calculate build plan: Failure to transfer org.apache.maven.plugins:mave ...
- struts.properties的参数描述
A.2.1 概述 如果我们希望覆盖在default.properties文件里面定义的默认配置,那就可以定义struts.properties文件,在里面设置我们需要的值,当然现在也可以在struts ...
- hdu 2873 Bomb Game 博弈论
SG函数打表,求NIM和!!! 代码如下: #include<cstdio> #include<cstring> #include<iostream> #inclu ...
- Educational Codeforces Round 4 D. The Union of k-Segments 排序
D. The Union of k-Segments You re given n segments on the coordinate axis Ox and the number k. The ...
- Jenkins+Maven+Git CI环境搭建手册
Jenkins+Maven+Git CI环境搭建手册 环境: OS:Linux version 2.6.32-220.23.2.ali878.el6.x86_64 (ads@kbuild) (gcc ...
- 【hdu2815-Mod Tree】高次同余方程-拓展BadyStepGaintStep
http://acm.hdu.edu.cn/showproblem.php?pid=2815 题意:裸题... 关于拓展BSGS的详细解释我写了一篇博文:http://www.cnblogs.com/ ...
- VCC、VDD、VEE、VSS等有关电源标注的区别
Almost all integrated circuits (ICs) have at least two pins which connect to the power rails of the ...
- 禁用和启用链接(a元素|LinkButton)的js方法
4 function disableLink(link) {5 //设置href属性6 link.href = "javascript:void(0);";7 ...