|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
第1 问:
* \% p0 x7 Z, ~( _% `/ E0 Z& o l# q$ g
Q:请问在初始化 CPU 堆栈的时候一开始在执行 mov r0, LR 这句指令时处理器是什么模式1 j1 k, r6 n- A8 g
6 k! q: Y# }! `# v4 f4 `; z( O Y0 `
A:复位后的模式,即管理模式.
: }# _7 t# D, c, \( ?) X9 m; ~& U4 Y4 ^' ^5 U5 C. H8 A4 T
) Y/ }0 N1 G2 Z2 S( [6 b' D
F6 K) d" w4 Y9 P& _0 p第 2 问:
5 W) R3 v" e5 L' }* o9 r8 C# L( J B0 z' K ^# o8 S
Q:请教:MOV 中的 8 位图立即数,是怎么一回事 0xF0000001 是怎么来的
h2 Y( y3 h+ K$ q
9 Y' {3 e% I# ^/ P$ Q) X5 aA:是循环右移,就是一个 0—255 之间的数左移或右移偶数位的来的,也就是这个数除以 4一直除, 直到在 0-255 的范围内它是整数就说明是可以的!
" c( r* B' V9 G& t/ `2 |+ q3 u4 Y. @/ ]0 S' l) F; R2 q3 u
A:8 位数(0-255)循环左移或循环右移偶数位得到的,F0000001 既是 0x1F 循环右移 4 位,符合规范,所以是正确的.这样做是因为指令长度的限制,不可能把 32 位立即数放在32 位的指令中.移位偶数也是这个原因.可以看一看 ARM 体系结构(ADS 自带的英文文档)的相关部分.
: Q7 Q( J r! [$ G) M/ y$ Y! N* G, e! ?
1 F6 `+ u' i) `5 a$ o, N
1 d$ z6 Z3 M; S# _" F! I+ [. T) |8 M
第 3 问:" d" g, r$ |. q; `' K$ `
- G( E% e8 q* H
Q:请教:《ARM 微控制器基础与实战》2.2.1 节关于第 2 个操作数的描述中有这么一段: #inmed_8r 常数表达式.该常数必须对应 8 位位图,即常熟是由一个 8 位的常数循环移位偶数位得到.9 z; T# v% U7 x6 I8 h+ s% P
' r' p3 e5 I+ S# O合法常量:0x3FC,0,0xF0000000,200,0xF0000001.
- b5 v* t! `7 r* D' p; F* ^3 Q+ Y9 N g t" @" e6 h9 {1 }3 b
非法常量:0x1FE,511,0xFFFF,0x1010,0xF0000010.
7 ~7 ^3 ~, C# |) P& D3 C$ e. t2 j& F
* K5 ?1 t" |; C+ Z常数表达式应用举例:5 F, g$ E3 O- |7 ]
2 F) v" G: c2 g/ U$ X: w...6 R$ V. {/ g/ W4 U% c
, x2 q) j: t( b6 N" [! g7 V...
8 M1 G: X* h( F/ o* E+ G
0 T d. k; r( u, H# H; V! aLDR R0,[R1],#-4 ;读取 R1 地址上的存储器单元内容,且 R1 = R1-40 q9 ~# E) W" M7 o+ k5 i2 g
# R9 l0 I" M9 |$ c, E' v
}# m( w1 C' s- |/ [% o" K
针对这一段,我的疑问:& m8 t# o! Q/ X+ D* {
" R9 y) N- _, J: w" A1、即常数是由一个 8 位的常数循环移位偶数位得到,这句话如何理解?* g* U1 ^- Q, }) R6 S4 _/ b
3 Y6 C+ @4 F3 [! `# p. U/ r2、该常数必须对应 8 位位图,既然是 8 位位图,那么取值为 0-255,怎么 0x3FC 这种超出 255 的数是合法常量呢? S1 Z7 I" O; {( H& w
" U% k3 @! O+ _: [" s$ Y" v3、所举例子中,合法常量和非法常量是怎么区分的 如 0x3FC 合法,而 0x1FE 却非法4 H9 `' K& m% {1 s
+ O% }3 [ a% Y9 T
0xF0000000,0xF0000001 都合法,而 0xF0000010 又变成了非法? |! A5 d! v0 w- S( a
* k& F# {) l* K, H- R9 f4、对于汇编语句 LDR R0,[R1],#-4,是先将 R1 的值减 4 结果存入 R1,然后读取 R1 所指单元的 值到 R0,还是先读取 R1 到 R0,然后再将 R1 减 4 结果存入 R1 j/ x L1 I4 Q: X4 V' }5 H
答:
+ i: A0 D' X% E1 _% a5 k1 O( A. c" V3 t+ q7 t' }- J# g
A:提示,任何常数都可用底数*2 的 n 次幂 来表示.% f2 E$ t/ L$ f: F
3 W% P7 A: t6 m9 U" H9 ^
1.ARM 结构中,只有 8bits 用来表示底数,因此底数必须是 8 位位图.
: z& M1 C5 v: R: M' L \) K
9 w$ p; y7 N" J2.8 位位图循环之后得到常数,并非只能是 8 位.
, {0 `- X% T$ v0 H4 l* z! X- w, c5 p# I
3.0xF0000010 底数是 9 位,不能表示.; @ N; u2 D% K! L
* q6 {6 N8 J5 c) C2 l! K% z4.LDR R0, [R1], #-4 是后索引,即先读,再减.
8 x( R& s- m; X, }# h" c- O
- Q1 l: l% l5 d" p" M! y8 [可以看一看 ARM 体系结构对相关寻址方式的说明.
9 d2 J+ P4 p7 j. `1 w
, H% ?; G4 ?* l
' Z: S: I% Y: [" T7 Y. o, X3 s# u第 4 问:
! g5 L% s0 s! D( y6 m: q! r# H/ C2 E/ t5 Q0 a8 I' ]
Q:在程序移植的过程中,什么代码段处于什么样的模式,这可真是一个困扰人的大难题,有没有一种标志或办法能够识别"代码段处于什么样的模式"
, L2 _* k* ]4 R+ L3 Q6 k+ l8 q' R) e- h1 C) x
A:读取 CPSR ,任何时候都是可以读。
% ~$ _% D! ^: k- ~& ^
% F& [7 n9 V7 L4 T3 _* |' @$ K' e$ S0 u+ `, n& r' c# Y
# c k/ C; m7 d X% ^
第 5 问:
# {( k* j: ^( z) E/ b3 R. }+ f$ s, C8 {0 c) J- d
Q:为什么保护现场时,总是保护 R0-R3,R12,为什么不保护 R4-R11
; T/ ~4 G* I( d& Y- Z
" b# {6 w, A6 ~# q0 AA:请看一看"ARM-thumb 过程调用标准"这个文档.
( m1 |& i0 k( f2 t/ `
( S- F# P+ U z9 s
( }0 h+ ^# `1 [) H0 X3 H
7 g# o& H- d3 L! O% \第 6 问:0 R3 _3 }) J# V- k. N4 s9 t$ [
& r2 j6 S2 {# B5 Y2 d% s" b4 K% NQ:请问 mov R1,#0x00003DD0 错误 ut of the range of operation 是怎么回事情
2 N1 t z: C$ B; i: r# @2 J5 F
( z$ ]% @# J" U/ ^: m8 t8 S我就是想 IODIR=0x00003dd0,汇编就是
0 |, }) M- M/ ]8 u
( F! l1 K. C1 ~6 gLDR R0,=IODIR
" \! q: y& n5 m3 R
8 o4 @0 I; n# L1 uMOV R1,#0x00003dd0% e$ V1 u! J" l7 w$ O3 `) n0 h
% t Z, c' p3 M- Z$ k, c3 |STR R1,[R0]7 _# O4 q* h% n
* I. l k5 m- q0 m4 J& I# P
编译时候说是超出操作范围, v& \) U" L5 n5 ?
$ T1 t8 v0 O: C5 w! W
A:使用 ldr,mov 的操作数为 8 位位图数。5 y# W& _7 M% Q. [7 d7 A, I- N
m0 W% n: M# D, }! @0 x% ?9 K; J$ u" J" D
* I0 @* l: ] u! P( `% B( ^2 I: n C第 7 问:
' M7 G# o. s. r" x8 x; \; s/ C5 N7 t( ^
Q:"在 ARM7TDMI(-S)处理器内部有 37 个用户可见的寄存器:"
; S4 l) A; D6 `( {/ _: {" N$ S/ S) ]/ P6 D
问题:"用户可见"应该怎样理解 这 37 个寄存器是否是 37 个不同的物理寄存器,
, h( C% p( Q; E6 ^! X) U/ r4 l% [, F9 T* ~ [
例如 R8 与 R8_fiq 应该是两个不同的物理寄存器吧
f$ V2 a9 [$ g; \9 A% [9 F% i( ]6 e/ q4 O* @3 i; k
A:用户可见是指用户可以通过程序操作的.R8 与 R8_fiq 是两个不同的寄存器.
v) L1 f& \9 V
+ f9 z* ^" i2 q! o% F/ N& d J, k
第 8 问:
: J& W) ]0 R6 k; f3 G3 R7 q. \8 ? `5 G. X! Z
Q:USR 模式,SVC 模式,IRQ 模式分别有哪些限制/ I- X0 f/ a% f& c6 ]
7 n" Z. `" U$ U/ W5 s( O
A:对于外设操作限制与芯片设计有关.USR 模式不能设置 CPSR 寄存器.1 L) m. i& I0 _. ^
/ ?: y+ d9 c7 t2 z3 H+ ?用户模式下无 SPSR 寄存器,代码可以为 ARM,Thumb.
0 |+ I& ?$ Y; [: s) x9 l( d9 y
6 U W7 E7 R1 B& V6 ~% L7 R5 \4 S/ b V6 H- t( U9 @
第 9 问:9 e# T+ `/ {+ B
+ ]! G7 Y" |( p: H# rQ:请问"在初始化堆栈时就决定了工作模式"是什么意思 如何决定工作模式的, M& I. w/ ?5 L8 u3 w" b; @% F
( O& P0 F' ^- C. ~A:设置 CPSR 寄存器。
/ s! Z! T2 O2 l1 d# P4 W
# B% t1 T& ]1 e, z8 M: I7 ~第 10 问:5 O- m* Z" L3 z4 ?6 a
6 ]9 v% P" ?3 Y9 ]$ p! Y+ eQ:请问:ARM 汇编程序设计中所谓的"文字池"作何理解
8 K1 \5 Y& `: rA:可以理解为常量数组,文字池中保存的是常量,这些常量可以是正常的常量,也可以是地址.
9 o! \3 B7 z" ^" ?+ m+ e4 S3 p% K+ I5 j1 _
|
|