ARM芯片详解翻译

发布者:未来感知最新更新时间:2016-05-10 来源: eefocus关键字:ARM  芯片详解 手机看文章 扫描二维码
随时随地手机看文章
译者注:这篇文章主要介绍了Risc结构的PDA芯片组成和汇编程序,翻译不周,肯定有错误,请多包涵,另外我忘记了出处,这里向作者表示歉意。
  
  RISC处理器被广泛应用在小型设备上,例如PDA,移动电话,智能热水器等。有很多关于RISC处理器的汇编程序,但最常见的还是ARM。
  下面我要谈的是ARM 7,因为我研究的是这个。
  让我们先了解一下ARM的架构。ARM处理器包含37个寄存器:31个通用的32位寄存器,以及6个状态寄存器。寄存器的设置取决于处理器状态。ARM状态执行32位指令,Thumb状态执行16位指令集。
  在ARM状态,有18个寄存器可用:可供直接存储的R0―R15,CPSR(当前程序状态寄存器),SPSR(被存储程序状态)。其中3个可直接存储器被称为服务寄存器。
  
  (R13)SP ??堆栈指针
  (R14)LR??连接寄存器,用来存储调用过程的函数地址(译注:可简单理解为过程返回地址)。并且,LR并非存储在堆栈中-它存在于寄存器中。
  (R15)PC??当前指令指针。用一般的mov指令就可以改变它的值,从而执行它所指向的命令。
  
  在Thumb 状态,有13个寄存器可用:R0-R8, R13-R15, CPSR, SPSR

  状态的改变,不会影响寄存器内容的变化。
  如果想进入Thumb状态,可以先将操作寄存器的状态位设为1(bit 1),然后执行BX指令。如果想进入ARM (译注:原文误为APM)状态,可以先将操作寄存器的状态位设为0(bit 0),然后执行BX指令。
  2种状态的指令集是不同的,但是很多指令都是类似的。Thumb指令集长度为2bytes,ARM-4bytes。关于2种状态指令的具体资料可以参考: http://www.atmel.com/dyn/resources/p...ts/doc0673.pdf 
  有趣的是很多指令可以同时操作多个寄存器。例如:
ADD     R3, SP, #4     相当于: R3:=SP+4 
  或者,用来存储寄存器入栈的指令:
PUSH {R2-R4, R7, LR}  这和x86汇编里面的pushad指令不同,在ARM汇编里面,这种将寄存器存入堆栈的方式是可行的。
  内存中,数据存储方式可以是低位存储(例如Intel寄存器)或者高位存储(例如Motorola寄存器)。所以,写代码时候,有必要指明数据存放方式。
  下面是一些ARM编译器的资料:
http://heanet.dl.sourceforge.net/sou...de-arm-win.exe  - GNU compiler with all consequences - all through command line + debugging through gdb. 

http://www.goldroad.co.uk/grARM.html - unpretentious ARM assembler. 

http://www.arm.com/support/downloads/index.html  - official tools for ARM’s develpment. Here you can only buy them. 

http://www.iar.com/  - alternative to IDA for ARM. 30-day's trial version is offered. 
  下面讲解一下由C++的ARM编译器生成的ARM汇编程序。
  一般地,分析不同程序的时候,经常碰到的并不是纯粹的汇编语言,而是由C++编译器生成的代码。当然,x86汇编程序员一般不会如此。
  函数调用:
  这里不存在函数参数调用约定(例如cdecl,stdcall 等)!所有的函数调用约定类似于Borland的fastcall。参数由寄存器传入,如果数目不够,由堆栈传入。
  例如:
ROM:0001F4E2   MOV R0, SP 

ROM:0001F4E4   MOV R2, *6 

ROM:0001F4E6   ADD R1, R4, *0 

ROM:0001F4E8  BL memcmp 
  参数的传递顺序对应于寄存器编号,R0为第一个,R1为第二个,R2为第三个(译注:比较有意思)。相当于:
int memcmp ( 

   const void *buf1, 

   const void *buf2, 

   size_t count 

); 
buf1 = R0 

buf2 = R1 

count = R2 

  函数返回值被存放在R0中:
ROM:0001F4E2   MOV R0, SP 

ROM:0001F4E4   MOV R2, *6 

ROM:0001F4E6   ADD R1, R4, *0 

ROM:0001F4E8  BL memcmp 

ROM:0001F4EC   CMP R0, *0 

ROM:0001F4EE   BNE loc_1F4F4 
  下面是一个利用堆栈传递参数的例子:
ROM:000BCDEC   MOV R2, *0 

ROM:000BCDEE   STR R2, [SP] 

ROM:000BCDF0   MOV R2, *128 

ROM:000BCDF2   MOV R3, *128 

ROM:000BCDF4  MOV R1, *14 

ROM:000BCDF6   MOV R0, *0 

ROM:000BCDF8   BL FillBoxColor 
  上面,R0-R3存储坐标,第5个参数(色彩)被存放在堆栈中。

  只有通过分析才可以确定操作数的数目。我们可以分析函数和它的调用部分。有时候,参数信息可以通过对寄存器和堆栈的操作观察出来。例如,在Thumb状态下,程序对R0-R7和服务寄存器的操作。所以,如果看到类似于下面的代码:
ROM:00059ADA   getTextBounds                          

ROM:00059ADA   PUSH {R4-R7, LR}, 
  可以认为它的参数被存放在R0,R1,R2,R3和SP。如果见到:
ROM:0005924E   ADD R0, SP, *0x14 

ROM:00059250   ADD R1, SP, *0x6C 

ROM:00059252   ADD R2, SP, *0x68 

ROM:00059254   ADD R3, SP, *0x64 

ROM:00059256   BL getTextBounds 
  我们看到只有R0-R3被使用,就是说只有4个参数被传递过来。

转移(Transitions )
  一般,转移分为条件转移和无条件转移。转移目标可以存放在寄存器或者其他处。寄存器转移一般用于Thumb/ARM 状态转换。无条件短转移指令为B(branch)命令。长跳转指令-BX(交换转移)。函数调用采用BL(连接转移),且调用时将返回地址存入LR寄存器。当然,改变PC寄存器内容也可以改变转移地址:
ADD PC, *0x64
但是C编译器通常不这样处理,它们在转移的时候,只是以写入命令改变PC寄存器。

分支(Branches)
  也称为转换,一般用法如下:
ROM:0027806E   CMP R2, *0x4D; 'M' 

ROM:00278070   BCS loc_27807A 

ROM:00278072   ADR R3, word_27807C 

ROM:00278074   ADD R3, R3, R2 

ROM:00278076  LDRH R3, [R3, R2] 

ROM:00278078   ADD PC, R3 

ROM:0027807  A

ROM:0027807  A loc_27807A                               

ROM:0027807  A B loc_278766 

ROM:0027807  C word_27807C DCW 0xAA, 0xBE, 0xC6, 0x180, 0x186; 0 

ROM:0027807  C DCW 0x190, 0x1A0, 0x1A8, 0x1DE, 0x1E4; 5 

ROM:0027807  C DCW 0x1B0, 0x212, 0x276, 0x1FE, 0x294; 10 
  首先,检查跳转标记,该标记必须小于0x40,如果大于,则跳到默认处理位置,即:loc_27807A。
  然后执行位于word_27807C 的转移控制表。这个表里面存放的是偏移,并非地址。随后,根据跳转标记,取表中的偏移,扩展之,加操作放入PC寄存器。比如,如果跳转标记为0,将会跳转到地址:
0x278078 (current value PC) +0xAA (offset from the table) + 0x4 (!!!) = 0x278126
  之所以加4,是因为ARM处理器的特征:操作PC寄存器时,其值应该比预先确定的数值大4(在文档“to ensure it is word aligned ”中有说明)。
  
内存存取

  在Thumb状态,处理器可以存取+/-256 字节的空间。因此,无法直接存取内存,而需要利用寄存器来引导。也就是无法直接定位到0x974170,而需要采用寄存器。例如:
ROM:00277FF6 LDR R0, =unk_974170 

ROM:00277FF8 LDR R0, [R0] 
  我们获得了0x974170处的数据,但是事情还没有结束!该有效地址(0x974170)处于有效的正负256 字节中:
ROM:00278044 off_278044 DCD unk_974170
这样,就是说,LDR指令的机器码中存储了该命令当前的地址。(译注:就是说0x974170虽然看起来比较大,实际上还是那+-256字节内,只不过通过LDR指令来定位)
  这里存在一个很艺术的优化方法:如果一个地址和该函数中另外一个被用到的地址有关联,那么这个地址可以通过算术运算指令或者间接存取来获取。举例来说,如果一个函数需要用到0x100000处的变量,并且需要用到0x100150处的另外一个变量,那么,编译器可以将这2个变量建立关联,或者采用以下代码:
LDR R0, =0x100000 

ADD    R0, *0xFF 

ADD    R0, *0x51 

LDR R0, [R0] 
  在x86里面,这种方法应用于结构中获取子结构接口。但是此处,却是一个常用的优化,这有什么好处呢?可以减小内存存储,并且算术运算比数据加载快得多。可以认为整个ARM汇编程序充满了不同的寄存器间算术运算。事实上,有多达16个寄存器用来进行此操作-减少内存和堆栈定位频度。因此,只有在非常大的函数中才需要用堆栈存储变量。对堆栈的操作和x86处理堆栈的方式一样。

IDA中的代码分析

  既然ARM文件没有统一格式,那么在加载ARM二进制映像的时候,有必要先加载该文件。在加载的时候,需要确定处理器类型。如果处理器规定代码必须按照处理器模块处理顺序,那么你可以加载映像文件并且指定需要的处理方式,ARM处理方式(低位处理)或者ARMB(高位处理)。并且,有必要建立ROM或者RAM段。总之没有固定的处理方式,具体的处理有赖于映像和每个ARM处理器的架构。例如,在ARM7中,内存一般有如下格式:
0x0 - 0x8000  of   RAM processor 

0x8000 -   0x1000000 ROM 

0x1000000 -   0x..... - SRAM (这里看出自身数目)
  现在就可以分析代码了,在很多设备中(一般都是移动电话),代码的入口设定为0x8000。ARM模式下的代码从0x8000开始执行,所以,开始执行的指令和该处的一样。处理器的IDA模块可以简单地分析此类switching语句,然后Thumb 代码在ARM中执行。如果手工修改跳转,可以按ALT-G,然后修改文件中的标记,如果为ARM文件,设为0,Thumb文件,设为1。
关键字:ARM  芯片详解 引用地址:ARM芯片详解翻译

上一篇:ARM指令集详解2
下一篇:ARM 浮点运算详解

推荐阅读最新更新时间:2024-03-16 14:53

ARM Linux中断机制之中断的申请
底层硬件操作方法 每一条中断线都有一个底层硬件操作函数集struct irq_chip 。大多数控制方法都是重复的 ,基本上只要有中断响应 、 中断屏蔽 、 中断开启 、 中断触发类型设置等方法就可以满足要求了。其他各种方法基本上和这些相同。 这些操作方法的实现在文件linux/arch/arm/plat-s3c24xx/irq.c中。 例如外部中断 IRQ_EINT0 ~ IRQ_EINT3都用以下操作函数集: static struct irq_chip s3c_irq_eint0t4 = { .name = s3c-ext0 , .ack = s3c_irq_ack, .mask = s3c_irq_mask,
[单片机]
ARM:机器人将带来协助而非取代人类
电子网消息,根据ARM委托第三方针对全球近4000名消费者进行的独立调查显示,仅少数受访者认为人工智能的发展将导致机器人盛行,取代人类就业。 消费者对未来的愿景相当乐观,有61%的受访者认为自动化技术与AI的日渐盛行「会让社会变得更好」。 考虑到人工智能将在未来逐渐融入日常生活,30%的消费者认为这项发展最不利的因素是「人类的工作变少或被迫转行」。 但多数受访者仍抱持正面态度,认为机器人不会取代人类,而是增进人类多数工作的效率,并协助执行更多繁冗且危险的任务。 ARM全球营销暨品牌传播副总裁Joyce Kim表示,调查结果显示普遍对AI的乐观以及其对可能带来的商机非常振奋人心,但人们目前只触及AI所具备潜力的冰山一角,仍有庞大的潜
[半导体设计/制造]
恩智浦:最专注于ARM的MCU厂商
MCU领域从来不缺热闹可看。 2011年12月6日,恩智浦发布了其LPC4300,它以204MHz的速度树立了MCU领域Cortex-M4性能的新标杆。这让1个半月前意法半导体声称的168MHz的Cortex-M4记录退休了。与此同时,恩智浦宣布其将LPC1800的性能提升到180MHz,这也是世界上最快的Cortex-M3 MCU。2天之后,EEWORLD就收到了意法半导体发出的新闻稿,称采用Green Hills软件公司最新软件工具独立进行的处理器性能评测证实,STM32 F4系列是迄今全球性能最高的ARM® Cortex™-M微控制器。 有多少人会看重哪款MCU的性能更高,恩智浦还是意法半导体?至少恩智浦半导体全球副总裁
[EEWORLD独家]
软银计划出售ARM在华子公司51%股权
北京时间6月5日据金融时报报道,软银旗下芯片设计公司ARM表示,将作价7.752亿美元出售中国半导体设计部门的多数股权。 ARM表示,将向财务投资者和公司的合作伙伴出售在华子公司ARM Technology China的51%权益,从而成立一家合资公司运营ARM在中国的半导体技术业务。 两年前,软银以243亿英镑收购了英国芯片设计公司ARM,此后签署协议将后者25%的股权出售给沙特支持的愿景基金,并有望再次让ARM上市。 软银集团表示,去年在中国设计的所有先进芯片中,约有95%是基于ARM技术,中国部门贡献了ARM总销售额的20%。 软银表示,交易完成后,Arm将继续从Arm中国授权生产Arm半导体产品生产的所有许
[半导体设计/制造]
基于ARM Linux的图像采集与蓝牙传输
  嵌入式Linux系统具有可移植性好、网络功能强、优秀的GNU编译工具、免费的开放源代码等优点。S3C2410处理器是一款采用ARM920T结构,内部资源非常丰富的32位嵌入式处理器。USB摄像头具有低廉的价格,良好的性能,加上Linux下有V4L支持对其编程,很容易集成到嵌入式系统中。蓝牙技术是目前被认可的短距离无线通信技术,广泛应用于手机、电脑以及汽车免提系统。   本文介绍基于嵌入式Linux的USB图像采集系统,并通过构建好的嵌入式Linux下的蓝牙环境将采集到的图片传送到蓝牙手机上,实现监控功能。   1 软硬件平台概述   系统硬件平台如图1所示。该平台软件上采用嵌入式Linux操作系统;硬件上采用Sams
[单片机]
基于<font color='red'>ARM</font> Linux的图像采集与蓝牙传输
ARM启动代码中_main 与用户主程序main()的区别
STM32启动代码主要是分配堆栈及设置向量表,然后跳转到__main函数。 跳转具体到代码段部分如下: Reset_Handler PROC EXPORT Reset_Handler IMPORT __main LDR R0, = __main BX R0 ENDP 当您看到__main函数时,估计应该有不少人认为这个是main函数的别名或是编译之后的名字,否则在启动代码中再也无法找到和main相关的字眼了。可事实是,__main和main是完全两个不同的函数,并且你无法找到__main代码,因为这个是编译器
[单片机]
基于ARM的炼胶釜数据采集器的设计
胶粘剂是生产竹胶合板的重要材料,我国南方许多中小竹胶合板企业自行生产胶粘剂。 胶粘剂的生产过程属聚合反应,采用控制反应釜内反应物温度的方法来进行生产,而现在都是通过人工凭借温度计进行控制,生产现场没有预警措施,这样产品质量很不稳定,并且生产工人的安全也得不到保障。这些企业急需要既经济又可靠的控制器,但聚合反应机理非常复杂,影响温度的因素也很多,需要分析大量的数据,为此我们开发了以LPC2132为控制核心的数据采集器。 1系统分析 根据工艺要求,反应在反应釜内进行,反应物是通过电子称计量后由真空泵打入反应釜内,整个生产包括升温阶段和恒温阶段,温度始终按给定的温度曲线变化。当需要升温时,在炼胶釜夹层内
[单片机]
基于<font color='red'>ARM</font>的炼胶釜数据采集器的设计
ARM设计的uClinux及其应用
1 嵌入式操作系统uClinux及其应用开发 嵌入式软件平台由以下部分组成:系统引导程序、嵌入式操作系统内核、文件系统。系统引导程序通常也称为BootLoad—er ,代码量虽少,但是作用非常大,相当于PC上的BOIS,负责将操作系统内核固化到Flash中和系统初始化工作.然后将系统控制权交给操作系统。文件系统是嵌入式软件平台占用存储量最大的一部分,也是与用户开发最相关的一部分,它存储了系统配置文件、系统程序、用户应用程序和必需的驱动程序。 1 .1 BootLoader程序 系统引导程序BootLoader是嵌入式系统加电后执行的第一个程序,一般应写入Flash存储器中并从起始物理地址0x0开始。在应用实际中Bo
[单片机]
<font color='red'>ARM</font>设计的uClinux及其应用
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved