zoukankan      html  css  js  c++  java
  • ARM体系结构与编程-3

    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++程序。然后就能够调用了。

  • 相关阅读:
    OA 办公自动化系统:权限管理模块的实现原理思路
    Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: org/hibernate/annotations/Entity
    Spring —— 三种配置数据源的方式:spring内置、c3p0、dbcp
    使用JdbcTemplate简化JDBC操作 实现数据库操作
    Spring aop——前置增强和后置增强 使用注解Aspect和非侵入式配置
    ( 解压缩版 免安装版 或 zip版 )如何修改mysql5.6.24 字符编码
    手机开发插件安装Xamarin
    JQuery对象转dom ,dom转jQuery
    读取XML
    【Android】完善Android学习(六:API 4.0)
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10631131.html
Copyright © 2011-2022 走看看