|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
, y: A! B! S8 b9 m. w; R
一.存储器的字与半字7 T) j7 ]4 w- G/ \
6 d- ? f7 J, o. f4 E
1.从偶数地址开始的连续的两个字节构成一个半字。4 y2 }' v) T' M* P" m& m* d
8 K$ \! a! s* C9 A
2.能被4整除的地址的连续4个字阶构成一个字* ~5 @6 u! Y# s% F# {( m1 x: W4 {/ D
1 y' H: }- G# G! R( k
ARM指令的长度刚好是一个字,Thumb指令的长度刚好是一个半字: g4 _. E, e: ?: v3 ^- o$ I
) e3 x8 }0 f% L
二.存储器的存储方式(半字对齐,字对齐)
' J/ j0 A) a8 c
& ^8 m! h+ t3 L, `- R/ Y1.半字对齐:存放一个数据的地址如果能被二整除,则它是半字对齐。反之,则是非半字对齐。
% r$ F2 S0 o( A8 E5 @9 N- ]7 K6 X, i% l% j; O* h/ j
2.字对齐:存放一个数据的地址如果能被四整除,则它是字对齐。否则,它是非字对齐。1 x' O! f( Z! a) v/ @+ U' z
5 p$ U( p2 n. z" C% q# s# c& Q6 Y
8 s) N5 c1 ]) ~% [# C, c) s p; E+ O7 e4 a1 l2 A1 J
三.ARM处理器状态:
! L! K$ B* [" n. U! a k
. u( d& |; x# W( U1 ]: NARM有两种处理器状态:ARM状态,Thumb状态。1 Y0 X( E3 a: u. P8 p
: |9 u) E6 W/ n1. ARM状态:32位。处理器执行字方式的ARM指令。2 X0 u$ v7 K* f3 I5 n8 R
: h# b( o5 _/ _$ t+ R) Y: N
2. Thumb状态:16位。处理器执行半字方式的Thumb指令。
7 M% p- F+ [+ v( l4 V
F6 Z, Y* H) L注:两个状态之间的切换是不会影响处理器的模式或寄存器的内容。
0 w" d! Z# I9 Y
& |+ F& `, N8 y. Y它们之间是如何进行切换的。! B: u9 ]) R d* h" E
6 n( U- N- A. {# ?& d
使用BX指令在ARM和Thumb状态之间进行切换。
- l+ t1 I% d) T! c9 C0 }8 |; c; l4 l' R/ ?( K( I
(但是,所有的异常处理都是在ARM状态中执行。如果异常发生在Thumb状态中,处理器会切换到ARM状态。在异常处理返回时,自动切换回Thumb状态。)
8 m: r# r8 B3 m' ]
2 E' i. k% t7 Y, d7 u从ARM状态切换到Thumb状态的程序代码:7 f/ y7 J, x& z/ _+ W- k; v
8 N5 G) K7 |) h. Z; i+ P0 j
+ V1 p% y7 T+ N3 U/ Q/ ~! L6 a |# W! x: N
, _( n8 X9 J3 l
+ m) p, b9 F, E1 {& j
3 P* r$ B1 T% g. f
具体程序来说明处理器状态: a. [( P2 r+ z# T+ L0 h
( |6 L. {1 J B# F& |& h' y" z
程序1:
}0 p; @* U4 y6 S1 G X5 s' R9 k% w3 U6 g" M8 @5 R
- N% S- F2 N% c+ z: p2 b3 T$ O0 V+ k* L6 j6 A; x+ i9 l, i
1 v0 C5 P" i) R O: TADR R0,TST+1
9 K$ ~8 [/ e- B6 X7 X1 R
% k+ K9 y0 E1 r6 {+ `3 @ ^注:伪指令ADR将寄存器内容的地址存入寄存器中。这里将地址TST+1存入R0中,这样就加载了转移地址并且设置了最近有效位。' `7 l& X ~# i/ ^
3 Z q, J5 }. _/ P5 u6 l
BX R0
5 I% ?) Z0 i0 \; z' W0 V
' a# h! G( G* T2 i3 d注:此时,R0中数值的第0位是1,所以该语句执行完处理器切换进入Thumb状态,开始执行Thumb指令7 ^; f8 G8 @2 J
' z2 z& }3 \: ?4 X6 M' i
(我们可以在AXD下看到此时状态寄存器的T位被置1.)
" R: b& L; c. p+ V; n
. @4 C8 d8 w1 [/ H YCODE16
& x1 h" d7 |; i0 S% N! R. m8 @! X6 `4 B' F, H0 b
注:
7 x8 q, c6 u+ Y6 _9 N- [
- M+ i2 W r6 O. t, kA汇编器需要知道什么时候产生ARM代码,什么时候产生Thumb 代码。
: p: M, A) W) {9 ]( v# b: c& D- ]# X1 f" `* T8 w: H8 O4 Z6 ~" }
B伪指令CODE16定义一下的程序被编译成Thumb模式,即后面的就是16位的Thumb指令了。4 O" f C7 ~) R$ {4 }
) {4 g5 y2 V4 ?, D: ^
C.伪指令CODE32定义一下的程序将被编译成ARM模式,即后面的就是32位的ARM指令。
7 a/ D1 m& o3 O9 l0 h& g: @& E* ~) n$ B' E" M) \4 |9 V% i
D伪指令CODE16和CODE32只是指示汇编器后面指令的类型,并不产生任何代码,也不进行程序状态的切换。4 w( g4 d' w0 ^0 s8 E& x' }) n; ]
* l# k E- [5 R$ J3 I
程序2:8 F; N( n/ u7 S! P
0 ?: h! _0 C- _; c& `
: t8 Q9 o. I. V. M p& |5 I
$ f6 }2 `9 k: o+ d v注:
. @& h4 @8 ~" t9 ~/ n; D' k) W& s/ u) m& b. b
在Thumb状态下,调用软中断:SWI 0XAB: N9 p/ L9 h6 u; H
8 O: A" G" q! v8 `在 ARM 状态下,调用软中断:SWI 0X1234569 i* ]$ a: H3 b% ~& V; b
/ b) _6 U" J; j, h, B) a" W5 f# ]. c四.ARM处理器模式:9 H: Q5 r5 ?. o1 ~/ `- e
& x+ [! O1 d' [7 l3 O: a$ n
ARM体系结构支持7中处理器模式:用户模式,快中断模式,中断模式,管理模式,中止模式,未定义模式和系统模式。5 g2 N& z3 W9 |/ Y2 W: u! R
7 t7 X/ v: E1 ~% \
' L9 r O" b- H. \
3 [0 f; J7 a) w" e* o
" G, \+ [7 Q% w& Z$ \
1.快中断模式,中断模式,管理模式,中止模式和未定义模式。它们称为异常模式。. q, d7 `; J) s# U
/ ^4 e g6 p( P+ M. C6 {4 ~. j
A.异常模式既可以通过程序切换进入外,也可以有特定的异常进入。
2 @' R$ q# O& A; l( h: T+ Z2 i, I
/ h, @( n4 ?9 r5 f2 mB.当特定的异常出现时,处理器进入相应饿模式。每种模式都有某些附加的寄存器。
9 ]& N; _7 g* ~1 O; l. K* J; d0 O: S
3 n& _( W( D3 Y8 t! y' f2.系统模式和用户模式,它们不能由异常进入。并且使用与用户模式相同的寄存器。
, V. T9 O$ Z$ x, `' k6 V7 W( @+ A5 B' z
A.系统模式是特权模式,不受用户模式的限制。操作系统在该模式下访问用户模式的寄存器比较方便。" k1 }8 V; I6 m' X# |/ p+ W9 @
/ P+ R; J) j% z$ j ]2 F; ~4 T5 u1 F4 O五.ARM体系的存储系统
& j& v2 y- g8 D! a
2 k0 s" O- r$ W2 P+ F; e5 q1.ARM7存储系统概要:8 ^/ k% q- Y$ D' a; ?
% z+ T7 ~9 t3 l+ ]; J1>.ARM7处理器采用冯.诺依曼结构,指令和数据共用一条32位数据总线(采用指令,数据和I/O统一编址)。' V* z. S2 h o5 n+ x$ S* h
B6 Y+ i' C( w7 w) l; J只有装载,保存和交换指令可访问存储器中的数据。! J9 y) T: O i1 L R8 N7 C0 Y
" R$ l6 O ^. I, r
Tiger 补充:
" S2 q i9 {$ _6 H6 e2 u" h" O" A6 C- @5 S
计算机结构说明:1 M. ~6 T8 T9 X2 L7 c( E) }
! [% a# K6 B* q' U5 K! o. J1> 冯诺依曼结构:把代码作为一中特殊的数据来操作。指令总线和数据总线及其存储区域是统一的。
/ e/ a0 [2 _( [, E* Y! \
2 m( m/ r$ V' I 哈佛结构:指令总线和数据总线及其存储区域是分开独立的。
( _* b/ N1 ^. x- c% U
. ]! k' h4 N' W' D1 z2 T
' |* s8 J1 w3 e+ M q2 k2>.ARM芯片一般在处理器核和外部存储器之间有! E- L! h( ~+ M! c" _3 Z, ?1 }9 A/ j
( Y; ^5 [; o8 M2 \# P y
一个存储器管理部件。 e& E; b4 I0 I: G
) I5 y. |+ T2 }7 M) Y$ d: \存储器管理部件的作用是将局部总线的信号和时序转换为现实的外部总线信号和时序。
. k( b. X- c2 L% d3 i) y
`" |8 |2 [7 e1 ]6 m) z! q
' S2 I7 Q; _5 e9 M* U% N& Z
4 f& R" S" |# r# E- n" @4 ]4 I) o& W
4 s4 D2 W. S6 K2 m- K注:各芯片生产商制定了自己的外部总线的信号和时序。+ w: {9 q( Y% \) ]6 M' C3 a
) G8 l5 R+ J- n) g5 A3. 地址空间 W, r' F" `4 [: @
" i: q" |. f- M9 y7 M
1> ARM地址空间有232个8位字节的地址空间。也可以看作是230个32位字或231个16位半字。
0 B! y8 q! V C% J/ H" \
x: w* B. K" g3 y, P! Z* c* }2> 如果在取指操作时地址发生溢出,只要没有执行预取的无效指令,就不会导致异常。9 S8 Z& K& `9 n& ^" I+ v
. R; Y8 R M$ ?: [6 Y0 Q
4. 存储器格式:! F# C% e5 ?0 Y# `+ n G
5 A, u* t! ^3 Z- e$ e! D
1> 地址空间的规则要求一个字或半字要求连续存储。# V% H0 J# k1 k9 w: v7 p
Q T8 g- H2 l, N) d- NEg:位于地址0x02处的字,它所包含的字节位于地址0x02,0x03,0x04,0x5
3 `/ i3 W4 W u$ x$ t1 c
0 e) @+ Z- i% \ 同理位于地址0x02处的半字,它所包含的字节位于地址0x02,0x03.. l. p4 k1 }8 Q: N& i
, C: [) Q2 j N* O2 t* ]# Y4 V* N* b
2> 存储器系统有两种映射机制:
) j/ @" h3 R: T q+ \6 N8 [) {. `4 N
A. 小端存储器系统:
, _1 ?0 u" b5 }2 I+ R1 ?
8 |% P4 g2 V8 u: C( q' o' C: Z; y3 H4 F数据的高字节存放在高地址中。
- ~& {/ ~. ^' ^9 ]# P( P) M* x! E( X$ j% x; ^$ X2 ~
B. 大端存储器系统:
u( F* {; t+ R" o" C
- A |: \6 z* }# V6 t数据的高字节存放在低地址中。! |8 K7 z* i8 B- P7 b
3 k8 z( n7 c6 I& ^# T
$ ?* D# y0 x% i7 l 5 n) H2 M6 ~ ?9 C
7 O- u7 y A$ G/ ~6 I9 D3>非对齐的存储器访问( i1 z, i& j! z7 C' W
4 D5 W1 f9 ^% b7 X8 s3 }) IA. ARM结构希望所有存储器访问时都对齐。即字访问的地址是字对齐的,或半字访问使用的地址是半字对齐的。若不满足上述条件的即为非对齐的存储器访问。& x, x+ @1 a- G4 Q! x& B
( Z, B( D2 X G, J( z" m
B. 把一个非字对齐(或非半字对齐)的地址写入ARM状态(或Thumb状态的)R15寄存器中,将会引起非对齐的指令取指。$ ]- Z( d# x: c% N- n: M
$ n# A2 a' s* C' V3 Q
C. 在一个非字对齐(或非半字对齐)的地址处读写一个字或半字会引起非对齐的数据访问。
( {- \& Q7 v1 J7 o- ~1 @" J6 p7 B8 s. j+ N0 d5 i( v
注:编程时应该注意的问题:7 f4 t1 R/ o8 Y8 U, S/ y0 ?
! i& Z1 m) i* p* ^ rARM处理器直接支持对齐存放的半字或字数据的存取,也就是可以使用一条相应的指令来实现对应操作。如果访问非对齐的半字或字数据,将需要多条指令组合才能实现对应操作,这对程序的执行效率影响较大。因此,在C语言编程中,定义的多字节变量或结构体,最好使其为对齐存放。
3 Y- ?6 N7 z! J0 N6 f% c, ?# |/ m/ i) f
1 o$ O ^) \6 @0 A7 f! [4 f* v6 I
4 b' L; W* s) [8 `* Y2 B- I/ h3 {
|
|