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汇编编程基础的更多相关文章

  1. ARM汇编编程基础之一 —— 寄存器

    ARM的汇编编程,本质上就是针对CPU寄存器的编程,所以我们首先要弄清楚ARM有哪些寄存器?这些寄存器都是如何使用的? ARM寄存器分为2类,普通寄存器和状态寄存器 寄存器类别 寄存器在汇编中的名称 ...

  2. Java Native Interface 基于JNI的嵌入式手机软件开发实例

    1.通过JNI和c/c++的库组件.其他代码交互 2.java和c不能互通的原因时数据类型问题 Introduction https://docs.oracle.com/javase/8/docs/t ...

  3. [IC]浅谈嵌入式MCU软件开发之中断优先级与中断嵌套

    转自:https://mp.weixin.qq.com/s?__biz=MzI0MDk0ODcxMw==&mid=2247483680&idx=1&sn=c5fd069ab3f ...

  4. iOS开发网络篇—网络编程基础

    iOS开发网络篇—网络编程基础 一.为什么要学习网络编程 1.简单说明 在移动互联网时代,移动应用的特征有: (1)几乎所有应用都需要用到网络,比如QQ.微博.网易新闻.优酷.百度地图 (2)只有通过 ...

  5. 用Netty开发中间件:网络编程基础

    用Netty开发中间件:网络编程基础 <Netty权威指南>在网上的评价不是很高,尤其是第一版,第二版能稍好些?入手后快速翻看了大半本,不免还是想对<Netty权威指南(第二版)&g ...

  6. Java开发知识之Java编程基础

    Java开发知识之Java编程基础 一丶Java的基础语法 每个语言都有自己的语法规范.例如C++ 入口点是main. 我们按照特定格式编写即可. Java也不例外. Java程序的语法规范就是 Ja ...

  7. 【嵌入式开发】 ARM 汇编 (指令分类 | 伪指令 | 协处理器访问指令)

    作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42408137 转载请著名出处 本博客相关文档下载 :  -- AR ...

  8. ARM汇编编程概述

    1.为什么需要学些汇编指令 2.ARM汇编指令分类 3.汇编程序框架 4.编程准备 +++++++++++++++++++++++++++++++++++ 1.为什么需要学些汇编指令 bootload ...

  9. 3.1 ARM汇编编程概述

    1. 汇编编程 为什么要学习汇编 1). Bootloader初始化 2). Linux kernel 3). 高效 2. ARM汇编分类 1. ARM标准汇编:ARM公司得汇编器适合在Windows ...

随机推荐

  1. LA 4256

    Traveling salesmen of nhn. (the prestigious Korean internet company) report their current location t ...

  2. POJ 2531 Network Saboteur (枚举+剪枝)

    题意:给你一个图,图中点之间会有边权,现在问题是把图分成两部分,使得两部分之间边权之和最大. 目前我所知道的有四种做法: 方法一:状态压缩 #include <iostream> #inc ...

  3. iOS后台如何保持socket长连接和数据传输

    工程中使用tcp长连接来和服务端进行数据传输,在IOS平台上,由于苹果的后台机制,会有以下问题: 当程序退到后台的时候,所有线程被挂起,系统会回收所有的socket资源,那么socket连接就会被关闭 ...

  4. SIOCADDRT: No such process

    配置Ubuntu靶机遇到的问题 如果你添加/修改默认网关时遇到这个问题. 原因:你要添加的网关不在你主机所在的网段. 解决方法: 比如你要添加的网关是10.57.50.1 sudo route add ...

  5. android真机自动化测试

    appium执行用例时报错问题: 问题解析: 一般该种情况都是因为来连接了多个设备,验证办法:cmd->执行adb devices  看结果是否是多个devices ,如果是这个问题,停掉多余设 ...

  6. Java-马士兵设计模式学习笔记-责任链模式-FilterChain功能

    一.目标 增加filterchain功能 二.代码 1.Filter.java public interface Filter { public String doFilter(String str) ...

  7. Qt通过UDP传图片,实现自定义分包和组包

    一.包头结构体 //包头 struct PackageHeader { //包头大小(sizeof(PackageHeader)) unsigned int uTransPackageHdrSize; ...

  8. Redis的Set操作

    集合的性质: 唯一性,无序性,确定性 注: 在string和link的命令中,可以通过range 来访问string中的某几个字符或某几个元素 但,因为集合的无序性,无法通过下标或范围来访问部分元素. ...

  9. USACO Section 2.4: Fractions to Decimals

    乍看题目感觉有难度,实际分析后其实是道简单题 /* ID: yingzho1 LANG: C++ TASK: fracdec */ #include <iostream> #include ...

  10. Scorm 1.2 开发文档

    原文出处 电华教育研究杂志2010年第7期<SCORM标准学习跟踪机制的研究与实现> http://blog.sina.com.cn/s/blog_964ec55001014nl0.htm ...