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. 通过 Mesos、Docker 和 Go,使用 300 行代码创建一个分布式系统

    [摘要]虽然 Docker 和 Mesos 已成为不折不扣的 Buzzwords ,但是对于大部分人来说它们仍然是陌生的,下面我们就一起领略 Mesos .Docker 和 Go 配合带来的强大破坏力 ...

  2. ThreadPoolTaskExecutor异步的处理报警发送邮件短信比较耗时的东东

    package com.elong.ihotel.util; import org.springframework.beans.factory.DisposableBean; import org.s ...

  3. 2014多校第七场1003 || HDU 4937 Lucky Number

    题目链接 题意 : 给定一个十进制n,让你转化成某个进制的数,让这个数只包含3 4 5 6这些数字,这个进制就成为n的幸运数字,输出有多少幸运数字,例如19,5进制表示是34,所以5是19的一个幸运数 ...

  4. (12)nehe教程6 纹理映射

    在这一课里,我将教会你如何把纹理映射到立方体的六个面. 学习 texture map 纹理映射(贴图)有很多好处.比方说您想让一颗导弹飞过屏幕.根据前几课的知识,我们最可行的办法可能是很多个多边形来构 ...

  5. UVA 10341 二分搜索

    Solve the equation:p ∗ e−x + q ∗ sin(x) + r ∗ cos(x) + s ∗ tan(x) + t ∗ x2 + u = 0where 0 ≤ x ≤ 1.In ...

  6. Fiddler手机抓包工具如何设置过滤域名?

    fiddler手机抓包工具如何设置过滤域名?如题.fiddler抓包可以完成我们移动开发者的调试测试需求.所以说抓包尤其重要,但是多余的网页请求和手机的其他链接影响我们手机开发的需求.下面我教大家怎么 ...

  7. 【LA3942-Remember the word 】Trie

    http://acm.hust.edu.cn/vjudge/problem/22109 题意:给定n个单词,一个字符串,问把这个字符串划分为若干个单词的连接(单词可重复使用)有多少种方案(mod200 ...

  8. 【poj2778-DNA Sequence】AC自动机+矩阵乘法

    题意: (只含AGCT)给定m个病毒串,让你构造一个长度为n的字符串(也只含有AGCT),问有多少种方案.n很大:1<=n<=2000000000 题解: 用病毒串建立AC自动机(num个 ...

  9. python爬煎蛋妹子图

    # python3 # jiandan meizi tu import urllib import urllib.request as req import os import time import ...

  10. iOS开发--基于AFNetWorking3.0的图片缓存分析

    图片在APP中占有重要的角色,对图片做好缓存是重要的一项工作.[TOC] 理论 不喜欢理论的可以直接跳到下面的Demo实践部分 缓存介绍 缓存按照保存位置可以分为两类:内存缓存.硬盘缓存(FMDB.C ...