ARM 的Thumb状态测试
作为一个使用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状态测试的更多相关文章
- ARM处理器的寄存器,ARM与Thumb状态,7中运行模式
** ARM处理器的寄存器,ARM与Thumb状态,7中运行模式 分类: 嵌入式 ARM处理器工作模式一共有 7 种 : USR 模式 正常用户模式,程序正常执行模式 FIQ模式(Fast ...
- ARM处理器的寄存器,ARM与Thumb状态,7中运行模式 【转】
转自:http://blog.chinaunix.net/uid-28458801-id-3494646.html ARM处理器工作模式一共有 7 种 : USR 模式 正常用户模式,程序正常 ...
- ARM状态和THUMB状态
ARM处理器的工作状态 在ARM的体系结构中,可以工作在三种不同的状态,一是ARM状态,二是Thumb状态及Thumb-2状态,三是调试状态. <嵌入式系统开发与应用教程(第2版)>上介绍 ...
- arm汇编学习(六)---跳转到thumb状态
通常函数返回使用 pop {r7,pc}或bx lr等方式(bx,b类似jmp为跳转指令,但bx可以指定跳转区域究竟为thumb还是arm指令.thumb指令指令的时候,直接填写该地址却总是产生SIG ...
- ARM ® and Thumb ®-2 指令系统
指令表关键词 Rm {, <opsh>} 寄存器移位方式,将寄存器的移位结果作为操作数而Rm值保持不变 <Operand2> 灵活的使用第二个操作数. ...
- 对于Android NDK编译器ARM和Thumb模式的理解
编译NDK项目时,编译器无法识别arm汇编,设置LOCAL_ARM_MODE := arm后问题解决, NDK文档上对LOCAL_ARM_MODE的说明如下: LOCAL_ARM_MODE By de ...
- LinuxShell脚本编程基础5--数值,字符串,文件状态测试,((..))和[[..]]的使用
1.数值比较 ! /bin/bash echo "enter a score:" read num1 ] then echo "Very Good" elif ...
- 监控 HTTP 服务器的状态(测试返回码)shell脚本
#!/bin/bash # 监控 HTTP 服务器的状态(测试返回码) # 设置变量,url为你需要检测的目标网站的网址(IP 或域名),比如百度 url=http://http://183.232. ...
- 036_监控 HTTP 服务器的状态(测试返回码)
#!/bin/bash #设置变量,url 为你需要检测的目标网站的网址(IP 或域名)url=http://192.168.4.5/index.html #定义函数 check_http:#使用 c ...
随机推荐
- myeclipse断点调试
(转) 作为开发者,掌握开发环境下的调试技巧十分有必要.去年就想把关于Eclipse断点调试总结下了.因为对时间的掌控程度仍需极大提高,结果拖到今年才写了此篇博文.关于java调试技术还有非常多.如J ...
- Ubuntu 12.04 64bit 配置完android 5.0编译环境后出现“could not write bytes: Broken pipe.”而无法进入输入帐号密码的登陆界面
Ubuntu 12.04 64bit 配置完android 5.0编译环境后出现“could not write bytes: Broken pipe.”而无法进入输入帐号密码的登陆界面.上网问了问百 ...
- Linux select TCP并发服务器与客户端编程
介绍:运行在ubuntu linux系统,需要先打开一个终端运行服务端代码,这时,可以打开多个终端同时运行多个客户端代码(注意客户端数目要小于MAX_FD);在客户端输入数据后回车,可以看见服务器收到 ...
- [React] React Fundamentals: Using Refs to Access Components
When you are using React components you need to be able to access specific references to individual ...
- iOS 并行编程:GCD Dispatch Queues
1 简介 1.1 功能 Grand Central Dispatch(GCD)技术让任务并行排队执行,根据可用的处理资源,安排他们在任何可用的处理器核心上执行任务.任务可以是一个函数 ...
- Lambda表达式(C语言-gcc编译器)
前言 先来啰嗦几句,身边的朋友,同事都喜欢在博客上记录自己在学习计算机编程技术路程上的一些问题和心得.就我个人而言,这是个好习惯,特别是在计算机编程领域,技术方向种类繁多,永无止境.所以,我也开始我人 ...
- HttpClient 通过域名访问请求接口出现java.net.UnknownHostException解决方法
在项目中,有一个功能需要请求另外一个项目的接口来获取数据.该项目接口都是通过域名请求访问.每当调用到一定阶段后都会出现未知域名,导致请求数据失败.以下是错误内容 java.net.UnknownHos ...
- magento搜索属性值的设置方法
前台特性(Frontend Properties)在快速搜索中应用(Use in quick search) - 开启此选项,在客户使用Header中的 搜索功能时Magento将搜索所有产品这个At ...
- Service层和DTO层的作用
Service层主要提供的几个作用:1.将业务逻辑层进行封装,对外提供业务服务调用.2.通过外观模式,屏蔽业务逻辑内部方法.3.降低业务逻辑层与UI层的依赖,业务逻辑接口或实现的变化不会影像UI层.4 ...
- (转)ASP.net中Timer无刷新定时器.
Timer控件要实现无刷新,得用到ajax技术 首先得添加一个ScriptManager控件,然后再添加一个UpdatePanel用于存放Timer控件内容的,就可以实现无刷新了.下面是详细的内容: ...