ARM存储系统:
ARM中用于存储管理的系统控制协处理器CP15:
包括16个32位寄存器,其编号为0到15。实际上对于某些编号的寄存器可能相应有多个物理寄存器。

訪问CP15寄存器的指令:MRC、MCR。

CP15中的寄存器C0和C1:C0中存放ARM相关的一些标示符;C1是一个控制寄存器,用于禁止/使能MMU、配置存储系统等。
比如以下的代码序列使能MMU:
MRC P15。0,R0,C1,0,0
ORR R0,#01
MCR P15。0,R0,C1。0,0
ARM中的存储管理单元MMU:
完毕虚拟存储空间到物理存储空间的地址映射,和存储器訪问权限的控制,设置虚拟存储空间的缓冲特性。

ARM中的CACHE及WRITE BUFFER技术:
快速缓存和写缓冲区位于主存储器SDRAM和CPU之间,用来提高存储系统的性能。
快速进程上下文切换技术:
通过改动系统中不同进程的虚拟地址,避免在进行进程间切换时造成的虚拟地址到物理地址的重映射。从而提高系统的性能。

ATPCS:ARM Thumb procedure call standard:ARM程序和Thumb程序中的子程序调用的基本规则
为适应特定的须要,除去主要的ATPCS外。有特定的ATPCS,如支持数据栈限制检查的ATPCS、支持仅仅读段位置无关的ATPCS、支持可读写段位置无关的ATPCS、支持ARM和Thumb程序混合使用的ATPCS、处理浮点运算的ATPCS。

主要的ATPCS:
寄存器的使用规则:
子程序通过R0 - R3来传递參数。R0 - R3可记作A0 - A3。

被调用的子程序在返回前无需恢复寄存器R0 - R3的内容。

在子程序中,使用R4 - R11来保存局部变量,R0 - R3可记作V1 - V8。

假设在子程序中使用了V1 - V8中的某些寄存器,则子程序在进入时必须保存这些寄存器的值。在返回前必须恢复这些寄存器的值。
R12可记作ip,用作子程序间scratch寄存器。

R13可记作sp。用作数据栈指针。

sp在进入子程序时的值和退出子程序时的值必须相等。
R14可记作lr,称为连接寄存器。用于保存子程序的返回地址。
R15可记作pc,称为程序计数器。
数据栈的使用规则:
栈指针能够指向不同的位置。当栈指针指向栈顶元素时,称为满栈。当栈指针指向与栈顶相邻的下个可用数据单元时,称为空栈。当数据栈向内存地址减小的方向增长时,称为递减栈。当数据栈向内存地址添加的方向增长时,称为递增栈。

综合起来有4中数据栈:FD(满递减)、ED(空递减)、FA(满递增)、EA(空递增)。

ATPCS规定数据栈为FD(满递减)类型。而且对数据栈的操作是8字节对齐的。
參数传递规则:
參数个数可变的子程序參数传递规则:參数个数不超过4个时,使用R0 - R3来传递參数;參数个数超过4个时,能够使用数据栈来传递參数。

子程序结果返回规则:结果为一个32位整数时。通过R0返回;结果为64位整数时,通过R0,R1来返回。

C/C++以及汇编语言的混合编程:
内嵌汇编器指的是包括在C/C++编译器中的汇编器,它能够汇编内嵌的汇编指令。
内嵌的汇编指令使用方法:
操作数:作为操作数的寄存器和常量  能够是C/C++表达式。
物理寄存器:通常推荐在内嵌的汇编指令中不要指定物理寄存器,由于这可能会影响到编译器对寄存器的分配,进而影响代码的效率。

标号:内嵌的汇编指令中仅仅有B指令能够使用C/C++程序中的标号。
在C/C++程序中使用内嵌的汇编指令的语法格式:
在ARM C语言中:
__asm
{
instruction [;instruction]
...
[instruction]
}
在ARM C++语言中:
asm("instruction [;instruction]");
从汇编程序中訪问C程序中声明的全局变量:
首先。使用IMPORT伪操作声明该全局变量
其次,使用LDR指令读取该全局变量的内存地址
最后,依据数据的类型使用相应的LDR指令读取该全局变量的值。使用STR指令改动该全局变量的值
汇编程序、C程序以及C++程序的相互调用:
在C++程序中使用C程序头文件:
在C++程序中使用C程序的系统头文件:直接包括。

由于系统已经运行过了extern "C" {}的伪操作。
在C++程序中使用C程序的用户自己定义头文件:
方法1:将其放在 extern "C" {} 中。比如:
//C++ code
extern "C"
{
#include "mycheader1.h"
}
方法2:在该C程序头文件里使用extern "C" {}。比如:
//C header file
#ifdef __cplusplus
extern "C" {
#endif
//C头文件实际内容
#ifdef __cplusplus
}
#endif
C程序调用汇编程序:
首先,汇编程序的设计要遵循ATPCS规则,保证程序调用时參数的正确传递。
其次,在汇编程序中使用EXPORT伪操作声明本程序标号。使得本程序能够被别的程序调用。
最后,在C语言程序中使用externkeyword声明该汇编程序标号,然后就能够调用了。
汇编程序调用C程序:
首先。汇编程序的设计要遵循ATPCS规则,保证程序调用时參数的正确传递。

最后。在汇编程序中使用IMPORT伪操作声明将要调用的C程序。然后就能够调用了。
C++程序调用C程序:在C++程序中用keyword extern "C" 声明被调用的C程序。
汇编程序调用C++程序:
首先。汇编程序的设计要遵循ATPCS规则。保证程序调用时參数的正确传递。
其次。在C++程序中使用extern "C" 声明被调用的C++程序。
最后,在汇编程序中使用IMPORT伪操作声明将要调用的C++程序。然后就能够调用了。

ARM体系结构与编程-3的更多相关文章

  1. ARM体系结构与编程

    ARM处理器的7中执行模式:usr.fiq.irq.svc.abt.und.sys. ARM处理器共37个寄存器:31个通用寄存器(未备份寄存器R0-R7,在全部模式下指的都是同一个物理寄存器:备份寄 ...

  2. ARM体系结构与编程-5

    GET通经常使用于包括定义常量的源文件. 比如:GET 2440addr.inc 用AREA定义一个段.ENTRY用于指定程序的入口点,END用于告诉汇编器源文件已经结束. 比如: AREA init ...

  3. ARM体系结构与编程读书笔记——处理器的寄存器

    ARM处理器共有37个寄存器,其中包括: 31个通用寄存器,包括程序计数器(PC)在内,寄存器都是32位: 6个状态寄存器,这些寄存器都是32位的,目前只使用了其中12位: 通用寄存器 可以分为下面3 ...

  4. ARM体系结构与编程读书笔记——处理器的运行模式

    ARM处理器共有7种运行模式,如下表: 处理器模式 描述 用户模式(User, usr) 正常程序执行的模式 快速中断模式(FIQ, fiq) 用于高速数据传输和通道处理 外部中断模式(IRQ, ir ...

  5. ARM的体系结构与编程系列博客——ARM体系版本

    ARM体系版本前言 很多人都知道,ARM有许多版本,口中最长说的就是ARM7\ARM9\ARM11,诚然,这个的确是ARM处理器的版本,但绝对不是ARM的版本,其实ARM到迄今为止经历了6代版本,随着 ...

  6. ARM的体系结构与编程系列博客——ARM处理器系列介绍

    ARM处理器系列介绍 现在到了3月,过年过得过于舒服了.系列博客也停更了近半月,我果然是个慢(lan)性(gui)子,那么趁着到校的第一天晚上,就写一篇博客来继续我的系列博客了!众所周知,ARM处理器 ...

  7. ARM体系结构和汇编指令

    第一节 可编程器件的编程原理 1. 可编程器件的特点 1 . CPU在固定频率的时钟控制下节奏运行 2 . CPU可以通过总线读取外部存储设备中的二进制指令集,然后解码执行 3 . 这些可以被CPU解 ...

  8. ARM体系结构简介

    ARM体系结构简介 新一代的ARM9处理器,能达到两倍ARM7的处理能力,它们的区别如下: ARM微处理器的工作状态(可切换): 第一种为ARM状态,此时处理器执行32位的字对齐的ARM指令 第二种为 ...

  9. ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(2)- 寄存器

    1. 前言 2. 指令运行与异常处理寄存器 ARM体系结构的寄存器分为两类: (1)系统控制和状态报告寄存器 (2)指令处理寄存器,如累加.异常处理 本部分将主要介绍如上第(2)部分的寄存器,分为AA ...

随机推荐

  1. 清北刷题冲刺 11-03 a.m

    纸牌 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> ...

  2. C#正则表达式快速入门

    作者将自己在学习正则表达式中的心得和笔记作了个总结性文章,希望对初学C#正则表达式的读者有帮助. [内容] 什么是正则表达式 涉及的基本的类 正则表达式基础知识 构建表达式基本方法 编写一个检验程序 ...

  3. Exadata 上关于SAS盘的小秘密

    案例概述 一个X3-2 的Exadata临时客户,ORACLE原厂工程师在进行onecommand初始化的过程中,执行到第6步,calibrate检测存储节点磁盘性能时报错,后续工作无法继续.而由于一 ...

  4. POJ1020 Anniversary Cake

    题目来源:http://poj.org/problem?id=1020 题目大意:有一块边长为s的正方形大蛋糕,有n个客人,每个客人想分一块边长为si的正方形蛋糕.求这块大蛋糕能否恰好满足所有客人的需 ...

  5. POJ 2068 NIm (dp博弈,每个人都有特定的取最大值)

    题目大意: 有2n个人,从0开始编号,按编号奇偶分为两队,循环轮流取一堆有m个石子的石堆,偶数队先手,每个人至少取1个,至多取w[i]个,取走最后一个石子的队伍输.问偶数队是否能赢. 分析: 题目数据 ...

  6. linux shell 脚本 历史文件清理脚本,按天,按月,清理前N天的历史文件,删除指定大小历史文件,历史文件归档清理

    不知道大家那有没有要清理的这个事情.需要清理目录历史文件.可能后续也会有很多其他地方需要清理历史文件,可能会用到. 我这两天空闲写了个脚本,清理比较方便,有要进行清理的大量历史文件的话可以用. 脚本用 ...

  7. Jmeter4.0----正则表达式提取器(12)

    1.说明 有时候需要将前一个请求返回的数据作为下一个请求的参数时,我们就需要正则表达式提取器.使用正则表达式提取器去提取我们想要的部分再传入后面的请求中. (之前看了一篇不错的博客,可以参考学习 ht ...

  8. urlScan 配置阻止sql注入

    工具 urlscan_v31_x64 urlscan_v31_x86 URLScan是一个IIS下的ISAPI 筛选器,它能够限制服务器将要处理的HTTP请求的类型.通过阻止特定的 HTTP 请求,U ...

  9. Oozie安装的说明

    不多说,直接干货! Oozie相当于Hadoop的一个客户端,因此集群中要有一台机器部署Oozie server端即可,由于可以有任意多个客户端连接Oozie,故每个客户端都必须部署Oozie cli ...

  10. Spark Mllib里的卡方检验

    不多说,直接上干货! import org.apache.spark.mllib.stat.Statistics 具体,见 Spark Mllib机器学习实战的第4章 Mllib基本数据类型和Mlli ...