您的位置 首页 动态

ARM 的Thumb状况测验

作为一个使用ARM的学习者,有必要全面了解你的处理器内核。尽管有些内容可能在实际应用中用不到,但是了解还是很必要的。Thumb状态,是…

作为一个运用ARM的学习者,有必要全面了解你的处理器内核。尽管有些内容可能在实践使用顶用不到,可是“了解”仍是很必要的。Thumb状况,是ARM的一个特征,可是你知道Thumb状况与ARM状况最大的差异是什么,ARM公司规划Thumb状况的初衷是什么?
带着这些问题,我就Thumb状况写了一个简略的程序以作测验。测验渠道是ADS1.2,先贴上测验代码。

GET2440addr.inc
AREAInit,CODE,READONLY
CODE32

ENTRY
EXPORT__ENTRY
__ENTRY
bResetHandler
bHandlerUndef;handlerforUndefinedmode
bHandlerSWI;handlerforSWIinterrupt
bHandlerPabort;handlerforPAbort
bHandlerDabort;handlerforDAbort
b.;reserved
bHandlerIRQ;handlerforIRQinterrupt
bHandlerFIQ;handlerforFIQinterrupt
HandlerFIQ
b.
HandlerIRQ
b.
HandlerUndef
b.
HandlerSWI
b.
HandlerDabort
b.
HandlerPabort
b.
ResetHandler
ldrr0,=WTCON;watchdogdisable
ldrr1,=0x0
strr1,[r0]

movr1,#0x34
ldrr0,=ThumbState+1
bxr0

CODE16
ThumbState
addr0,r0,r1
ldrr0,=HandlerFIQ
ldrr0,[r0]
ldrr0,=BackARM
bxr0

CODE32
ALIGN
BackARM

ldrr0,=GPFCON
ldrr1,=0x55aa
strr1,[r0]
ldrr0,=GPFDAT
ldrr1,=0x0
strr1,[r0];
b.

END

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

__ENTRY [0xea00c]bResetHandler
04 [0xea007]bHandlerUndef
08 [0xea007]bHandlerSWI
0c [0xea008]bHandlerPabort
10 [0xea006]bHandlerDabort
14 [0xeafffffe]b0x14;(__ENTRY+0x14)
18 [0xea001]bHandlerIRQ
1c [0xeaffffff]bHandlerFIQ
HandlerFIQ[0xeafffffe]bHandlerFIQ
HandlerIRQ [0xeafffffe]bHandlerIRQ
HandlerUndef[0xeafffffe]bHandlerUndef
HandlerSWI[0xeafffffe]bHandlerSWI
HandlerDabort[0xeafffffe]bHandlerDabort
HandlerPabort[0xeafffffe]bHandlerPabort
ResetHandler[0xe3a00453]movr0,#0x53
3c [0xe3a01]movr1,#0
40 [0xe5801]strr1,[r0,#0]
44 [0xe3a015d0]movr1,#0x34
48 [0xe59f0028]ldrr0,0x78;=#0x51
4c [0xe12fff10]bxr0
ThumbState [0x1840]addr0,r0,r1
52 [0x480a]ldrr0,0x7c;=#0x20
54 [0x6800]ldrr0,[r0,#0]
56 [0x480a]ldrr0,0x80;=#0x5c
58 [0x4700]bxr0
5a [0x0]dcw0x (阐明:为了使下边的CODE32代码4字节对齐起到占位效果)
BackARM [0xe59f0020]ldrr0,0x84;=#0x56050
60 [0xe59f1020]ldrr1,0x88;=#0x055aa
64 [0xe5801]strr1,[r0,#0]
68 [0xe59f001c]ldrr0,0x8c;=#0x56054
6c [0xe3a01]movr1,#0
70 [0xe5801]strr1,[r0,#0]
74 [0xeafffffe]b0x74;(BackARM+0x18)

从反汇编代码中,咱们能够看出Thumb状况的指令变为2个字节,所以指令代码密度更高。
下边,我再贴出用AXD调试过程中的现象。

mov r1,#0x34;运转后r1=0x34
ldr r0,=ThumbState+1;运转后r0=x51
bxr0;跳转到Thumbstate方位处履行,并且切换处理器到Thumb状况
CODE16
ThumbState;pc = x50
add r0,r0,r1;运转后r0=0x34051
ldr r0,=HandlerFIQ ;运转后r0=0x0x20
ldr r0,[r0];运转后r0=0xeafffffe
ldr r0,=BackARM
bxr0

剖析成果,”add r0,r0,r1;运转后r0=0x34051″阐明加法运算是32位的,也便是说CPU在Thumb状况仍是32位的,还能阐明寄存器也是32位的,并非16位的。”ldr r0,[r0];运转后r0=0xeafffffe”也阐明晰寄存器依然与ARM状况相同是32位的。
定论:尽管,ARM的Thumb状况的指令是16位的,可是CPU仍是32位的,并且寄存器也是32位的。所以,Thumb状况最大的差异便是指令变成16位的,寄存器少了一点,其他没什么改变。
附上ARM的Thumb状况与ARM状况寄存器的对应联系图

懂得的越多,越是无知

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/dongtai/277320.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部