作为一个使用ARM的学习者,有必要全面了解你的处理器内核。尽管有些内容可能在实际应用中用不到,但是“了解”还是很必要的。Thumb状态,是ARM的一个特色,但是你知道Thumb状态与ARM状态最大的区别是什么,ARM公司设计Thumb状态的初衷是什么?

带着这些问题,我就Thumb状态写了一个简单的程序以作测试。测试平台是ADS1.2,先贴上测试代码。

    GET 2440addr.inc    
    AREA    Init,CODE,READONLY
    CODE32     ENTRY    
    EXPORT    __ENTRY
__ENTRY 
    b    ResetHandler
    b    HandlerUndef    ;handler for Undefined mode
    b    HandlerSWI    ;handler for SWI interrupt
    b    HandlerPabort    ;handler for PAbort
    b    HandlerDabort    ;handler for DAbort
    b    .        ;reserved
    b    HandlerIRQ    ;handler for IRQ interrupt
    b    HandlerFIQ    ;handler for FIQ interrupt    
HandlerFIQ
    b .     
HandlerIRQ    
    b . 
HandlerUndef
    b .     
HandlerSWI    
    b . 
HandlerDabort
    b .     
HandlerPabort    
    b . 
ResetHandler
    ldr    r0,=WTCON       ;watch dog disable
    ldr    r1,=0x0
    str    r1,[r0]
    
    mov r1,#0x34000000
    ldr r0,=ThumbState+1
    bx  r0
    
    CODE16 
ThumbState
    add r0,r0,r1
    ldr r0,=HandlerFIQ
    ldr r0,[r0]
    ldr r0,=BackARM
    bx  r0
    
    CODE32
    ALIGN
BackARM
  
    ldr    r0,=GPFCON
    ldr    r1,=0x55aa
    str    r1,[r0]
    ldr    r0,=GPFDAT
    ldr    r1,=0x0
    str    r1,[r0]    ; 
    b .    
        END

我们在看一下反汇编代码。

__ENTRY         [0xea00000c]   b        ResetHandler
00000004        [0xea000007]   b        HandlerUndef
00000008        [0xea000007]   b        HandlerSWI
0000000c        [0xea000008]   b        HandlerPabort
00000010        [0xea000006]   b        HandlerDabort
00000014        [0xeafffffe]   b        0x14  ; (__ENTRY + 0x14)
00000018        [0xea000001]   b        HandlerIRQ
0000001c        [0xeaffffff]   b        HandlerFIQ
HandlerFIQ      [0xeafffffe]   b        HandlerFIQ
HandlerIRQ      [0xeafffffe]   b        HandlerIRQ
HandlerUndef    [0xeafffffe]   b        HandlerUndef
HandlerSWI      [0xeafffffe]   b        HandlerSWI
HandlerDabort   [0xeafffffe]   b        HandlerDabort
HandlerPabort   [0xeafffffe]   b        HandlerPabort
ResetHandler    [0xe3a00453]   mov      r0,#0x53000000
0000003c        [0xe3a01000]   mov      r1,#0
00000040        [0xe5801000]   str      r1,[r0,#0]
00000044        [0xe3a015d0]   mov      r1,#0x34000000
00000048        [0xe59f0028]   ldr      r0,0x00000078 ; = #0x00000051
0000004c        [0xe12fff10]   bx       r0
ThumbState          [0x1840]   add      r0,r0,r1
00000052            [0x480a]   ldr      r0,0x0000007c ; = #0x00000020
00000054            [0x6800]   ldr      r0,[r0,#0]
00000056            [0x480a]   ldr      r0,0x00000080 ; = #0x0000005c
00000058            [0x4700]   bx       r0
0000005a            [0x0000]   dcw      0x000 (说明:为了使下边的CODE32代码4字节对齐起到占位作用)
BackARM         [0xe59f0020]   ldr      r0,0x00000084 ; = #0x56000050
00000060        [0xe59f1020]   ldr      r1,0x00000088 ; = #0x000055aa
00000064        [0xe5801000]   str      r1,[r0,#0]
00000068        [0xe59f001c]   ldr      r0,0x0000008c ; = #0x56000054
0000006c        [0xe3a01000]   mov      r1,#0
00000070        [0xe5801000]   str      r1,[r0,#0]
00000074        [0xeafffffe]   b        0x74  ; (BackARM + 0x18)

从反汇编代码中,我们可以看出Thumb状态的指令变为2个字节,所以指令代码密度更高。

下边,我再贴出用AXD调试过程中的现象。

mov r1,#0x34000000  ;运行后r1=0x34000000

ldr r0,=ThumbState+1 ;运行后 r0=x00000051

bx  r0                        ;跳转到Thumbstate位置处执行,并且切换处理器到Thumb状态

CODE16

ThumbState                      ;pc = x00000050

add r0,r0,r1               ;运行后r0=0x34000051

ldr r0,=HandlerFIQ     ;运行后r0=0x0x00000020

ldr r0,[r0]            ;运行后r0=0xeafffffe

ldr r0,=BackARM

bx  r0

分析结果,"add r0,r0,r1;运行后r0=0x34000051"说明加法运算是32位的,也就是说CPU在Thumb状态还是32位的,还能说明寄存器也是32位的,并非16位的。"ldr r0,[r0] ;运行后r0=0xeafffffe"也说明了寄存器仍然与ARM状态一样是32位的。

结论:虽然,ARM的Thumb状态的指令是16位的,但是CPU还是32位的,而且寄存器也是32位的。所以,Thumb状态最大的区别就是指令变成16位的,寄存器少了一点,其他没什么变化。

附上ARM的Thumb状态与ARM状态寄存器的对应关系图

懂得的越多,越是无知

ARM 的Thumb状态测试的更多相关文章

  1. ARM处理器的寄存器,ARM与Thumb状态,7中运行模式

     ** ARM处理器的寄存器,ARM与Thumb状态,7中运行模式  分类: 嵌入式 ARM处理器工作模式一共有 7 种 : USR  模式    正常用户模式,程序正常执行模式 FIQ模式(Fast ...

  2. ARM处理器的寄存器,ARM与Thumb状态,7中运行模式 【转】

    转自:http://blog.chinaunix.net/uid-28458801-id-3494646.html ARM处理器工作模式一共有 7 种 : USR  模式    正常用户模式,程序正常 ...

  3. ARM状态和THUMB状态

    ARM处理器的工作状态 在ARM的体系结构中,可以工作在三种不同的状态,一是ARM状态,二是Thumb状态及Thumb-2状态,三是调试状态. <嵌入式系统开发与应用教程(第2版)>上介绍 ...

  4. arm汇编学习(六)---跳转到thumb状态

    通常函数返回使用 pop {r7,pc}或bx lr等方式(bx,b类似jmp为跳转指令,但bx可以指定跳转区域究竟为thumb还是arm指令.thumb指令指令的时候,直接填写该地址却总是产生SIG ...

  5. ARM ® and Thumb ®-2 指令系统

    指令表关键词        Rm {, <opsh>} 寄存器移位方式,将寄存器的移位结果作为操作数而Rm值保持不变       <Operand2> 灵活的使用第二个操作数. ...

  6. 对于Android NDK编译器ARM和Thumb模式的理解

    编译NDK项目时,编译器无法识别arm汇编,设置LOCAL_ARM_MODE := arm后问题解决, NDK文档上对LOCAL_ARM_MODE的说明如下: LOCAL_ARM_MODE By de ...

  7. LinuxShell脚本编程基础5--数值,字符串,文件状态测试,((..))和[[..]]的使用

    1.数值比较 ! /bin/bash echo "enter a score:" read num1 ] then echo "Very Good" elif ...

  8. 监控 HTTP 服务器的状态(测试返回码)shell脚本

    #!/bin/bash # 监控 HTTP 服务器的状态(测试返回码) # 设置变量,url为你需要检测的目标网站的网址(IP 或域名),比如百度 url=http://http://183.232. ...

  9. 036_监控 HTTP 服务器的状态(测试返回码)

    #!/bin/bash #设置变量,url 为你需要检测的目标网站的网址(IP 或域名)url=http://192.168.4.5/index.html #定义函数 check_http:#使用 c ...

随机推荐

  1. Bluetooth 4.0之Android 讲解

    Android平台包含了对蓝牙网络协议栈的支持,它允许一个蓝牙设备跟其他的蓝牙设备进行无线的数据交换.应用程序通过Android蓝牙API提供访问蓝牙的功能.这些API会把应用程序无线连接到其他的蓝牙 ...

  2. 适用于cocos2dx的编辑器:Texture,Tilemap,Particle,Action,Level etc

    原文:http://www.cocos2d-x.org/wiki/Editors_for_cocos2d-x_TextureTilemapParticleActionLevel_etc Action ...

  3. phpcms 源码分析一: common.inc.php

      其实就是从网上找到的的逆雪寒的分析, 我下来之后发现格式和错字的问题,非常影响阅读,现在我就是做了下搬运工的角色, 同时将格式调整到可读性提高点而已,让各位看官稍微舒心点: 下面进入整体: < ...

  4. C#数据类型中的decimal精度比double更高

    decimal 128bit大小 有效数字:28~29,虽然decimal类型有比浮点类型更高的精度,但它的范围更小.故double转decimal有可能发生溢出错误,此外,decimal的计算速度稍 ...

  5. ZBLibrary不能运行的解决方法

    ADT运行   右键ZBLibrary Demo > Run as > Android Application 可能出现部分错误,解决方案如下: 右键Project(这里为ZBLibrar ...

  6. [Form Builder]Oracle Form系统变量中文版总结大全

    转:http://yedward.net/?id=57 Form中的系统变量,它存在于一个Form的整个运行时期的会话之中,变量包含了有关Form相关属性的字节信息.有些变量标明了当前状态,还有些变量 ...

  7. Android 頁面中有 EditText ,進入時取消自動彈出鍵盤

    Android 畫面裡的 EditText 被 Focus 時 會自動彈出鍵盤 這是方便使用者習慣的設計 不過筆者在開發時發現 有時候方便過頭了 原因 一開始進入有 EditText 的頁面時 Edi ...

  8. C# Mutex对象的使用

    C# Mutex对象的使用 C#语言有很多值得学习的地方,这里我们主要介绍C# Mutex对象,包括介绍控制好多个线程相互之间的联系等方面. 如何控制好多个线程相互之间的联系,不产生冲突和重复,这需要 ...

  9. php中怎么实现后台执行?

    http://www.cnblogs.com/zdz8207/p/3765567.html php中实现后台执行的方法: ignore_user_abort(true); // 后台运行set_tim ...

  10. UIKit各类概述

    1.UIAcceleration: 被叫做加速事件的一个UIAcceleration类的实例是用来代表即时的三维加速数据.为了接收重力加速度,要注册一个应用应用程序作为一个共享UIAccelerate ...