[基于Android的ARM汇编语言系列]之一:ARM汇编语言开篇

作者:郭嘉

邮箱:[email protected]

博客:http://blog.csdn.net/allenwells

github:https://github.com/AllenWell

这是【基于Android的ARM汇编语言系列】博文的开篇文章,这里会先介绍一下ARM处理器的大致分类和作用。

一 ARM处理器与ARM指令集

整个ARM处理器被分为三个部分:

  • Classic
  • Embedded
  • Application

Classic被称为经典系列。

ARM1~ARM11一直都以数字来命名,ARM12以后改为用Cortex命名。Cortex有以下几个分类:

  • Cortex-A:广泛用于智能手机、上网本、电子书以及数字电视等。
  • Cortex-M:用于微控制领域,该系列的特点是高能效和低功耗。
  • Cortex-R:用于支持深层嵌入式的饿实时应用,该系列的特点是低功耗、良好的中断行为、卓越性能以及与现有平台的高兼容性。

尽管ARM处理器版本众多,它是很多型号ARM处理器兼容一套ARM指令集,ARM架构与ARM处理器的对应关系如下图所示:

上图涉及的技术,这里也简单提一下:

  • VFP:为ARM处理器提供了浮点运算功能。
  • Jazelle:允许某些架构的硬件上加速运行Java字节码。
  • SIMD:多媒体指令集。
  • TrustZone:安全性控制,避免产品受到外部的恶意攻击。
  • NEON:NEON是SIMD体系结构的扩展,NEON在执行上比传统的SIMD占用更少的指令周期。

Android最初选择ARM作为平台设备的处理器结构,并做了专门的优化。发展到Android4.1版本以后,已经全面支持ARM、x86和MIPS三种架构的处理器。

二 ARM处理器的工作模式和工作状态

2.1 ARM处理器的工作模式

ARM处理器共37个32位处理器,其中有31个通用寄存器和6个状态寄存器。ARM处理器支持7种运行模式,分别是:

  • 用户模式(usr):ARM处理器正常的程序运行状态。
  • 快速中断模式(flq):用于高速数据传输或通道处理。
  • 外部中断模式(irq):用于通用的中断处理。
  • 管理模式(svc):操作系统使用的保护模式。
  • 数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储以及存储保护。
  • 系统模式(sys):运行具有特短的操作系统任务。
  • 未定义指令终止模式(und):当未定义的指令执行时进入该模式。

2.2 ARM处理器的工作状态

  • ARM状态:执行32位字对齐的ARM指令。
  • Thumb状态:执行16位字对齐的ARM指令。

Thumb状态下的寄存器的命名与ARM有部分差异,它们的对应关系如下所示:

  • Thumb状态下的R0~R7与ARM状态下的R0~R7相同。
  • Thumb状态下的CPSR与ARM状态下的CPSR相同。
  • Thumb状态下的FP与ARM状态下的R11相同。
  • Thumb状态下的IP与ARM状态下的R12相同。
  • Thumb状态下的SP与ARM状态下的R13相同。
  • Thumb状态下的LR与ARM状态下的R14相同。
  • Thumb状态下的PC与ARM状态下的R15相同。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 10:06:11

[基于Android的ARM汇编语言系列]之一:ARM汇编语言开篇的相关文章

[基于Android的ARM汇编语言系列]之三:ARM汇编语言程序结构

作者:郭嘉 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell Android平台的ARM汇编是GNU ARM汇编格式,使用的汇编器是GAS(GNU Assembler),GAS有自己的一套语法结构.详细的内容可以查阅GAS语法结构官方手册. 我们先来看一个完整的ARM汇编程序: C代码: #include <stdio.h> int main(int argc,

ARM v7-A 系列CPU的MMU隐射分析

ARM v7-A 系列CPU的MMU隐射分析 摘要:ARM v7-A系列的CPU加入了很多扩展,如多核处理器扩展.大物理地址扩展.TrustZone扩展.虚拟化扩展.若支持大的物理地址,则必须支持多核处理器:若支持虚拟化,则必须支持大的物理地址.多核处理器.TrustZone.加入这些扩展后,相应的MMU(虚拟地址到物理地址的隐射功能)结构也改变了许多.本文首先分析加入扩展后MMU的整体结构,然后详细介绍地址转换中用到短描述符格式(32位)和长描述符格式(64位),以及如何实现虚拟地址到物理地址

linux驱动系列之arm汇编

在arm平台学习linux时,会遇到arm汇编指令,arm汇编指令与8086汇编指令很多地方都不同,在此记下来以免后面忘了,同时在学习了汇编指令之后分析一些汇编指令编写的代码. 一.相对跳转指令b.bl b.bl指令都实现短跳转,bl指令执行后会在链接寄存器r14中保存下一条指令的地址. 二.数据传送指令mov mov指令会把一个寄存器的数赋值给另一个寄存器,或者把一个常数传递给另一个寄存器. 如:mov  r0,r1  //将r1中的值传递给r0,mov r0,#0xff //将常数0xff传

[lushengduan]【基于Android N详解HelloWorld系列】00、简述和HelloWorld实现

想必大家对HelloWorld并不陌生,堪称"编程入门经典"!我们知道,HelloWorld是一个最简单的小程序,但是,要运行这个简单小程序,Android系统框架可做了不少事情,这涉及到AMS.PMS.WMS等各种系统服务,系统服务之间相互协作,有条不紊地完成应用程序的安装.运行等操作:网上也有很多文章对Android框架进行了分析,大部分讲得也很精彩.很透彻,但是,确实是这些资料有些老旧,因此,想围绕着HelloWorld,基于Android N(Android 7.0/7.1)整

基于Android平台的i-jetty网站智能农业监控系统

基于android平台i-jetty网站的智能农业监控系统 摘要:传统的监控系统,一般是基于PC的有线通信传输,其有很多不足之处,如功耗较高.布线成本高.难度大,适应性差,可扩展性不强,增加新的通信线路需要再次布线施工,而且维护起来也比较麻烦,一旦线路出问题,需要繁琐的检查.而嵌入式Web监控系统是基于物联网技术,其无线通信技术具有成本低廉.适应性强.扩展性强.信息安全.使用维护简单等优点. 智能农业中,种植大棚是通过大棚内安装温湿度以及光照传感器,来对农作物的环境参数进行实时采集,由Web监控

【嵌入式开发】ARM 芯片简介 (ARM芯片类型 | ARM处理器工作模式 | ARM 寄存器 | ARM 寻址)

作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42375701 相关资源下载 :  -- 三星 ARM Architecture Reference Manual 文档 : http://download.csdn.net/detail/han1202012/8324641 一. ARM 芯片类型 1. ARM 分类 (1) ARM 分类类型(芯片 | 核 | 指令架构) ARM 分类 : -- ARM 芯片类型

Android Studio使用技巧系列教程(四)

尊重劳动成果,转载请注明出处:http://blog.csdn.net/growth58/article/details/46866503 关注新浪微博:@于卫国 邮箱:[email protected] 这是我发表在Google+上的Android Studio每日技巧的第三篇文章.你可以从这查看以前发表的文章. 关于键位映射 Android Studio 提供了不同的键位映射(即快捷键和它对应的操作之间的映射),你可以在"Settings->Keymap"菜单里面查看当前所使

一个基于Android系统的新闻客户端(一)

一.整体概述 在服务器端,通过对凤凰网的抓取存入数据库,客户端通过向服务器发送请求得到新闻. 服务端用WCF,宿主为window服务,客户端为Java写的安卓程序. 二.客户端 我在eclipse里新建了个Android项目,命名为MyNewClient,eclipse自动生成二个xml布局文件,如图: 其中,fragment_main.xml是新版的布局文件,暂时不会用,把它删掉. 新建xml文件,命名为activity_foot.xml,在这里我们要做app的底部,先上代码: <?xml v

基于 Android NDK 的学习之旅----- C调用Java

http://www.cnblogs.com/luxiaofeng54/archive/2011/08/17/2142000.html 基于 Android NDK 的学习之旅----- C调用Java许多成熟的C引擎要移植到Android 平台上使用 , 一般都会 提供 一些接口, 让Android sdk 和 jdk 实现. 下文将会介绍 C 如何 通过 JNI 层调用 Java 的静态和非静态方法. 1.主要流程 1.  新建一个测试类TestProvider.java a)