|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
第1 问:% U. G% c1 c" x. r0 b1 m" c
8 n7 c1 w* x; UQ:请问在初始化 CPU 堆栈的时候一开始在执行 mov r0, LR 这句指令时处理器是什么模式4 X" `8 ~( W( j1 c
9 \% Y% c* B* k
A:复位后的模式,即管理模式.
' |" U W4 d6 e: `/ W& q Q( V# U0 Z* P( C2 [5 {! M9 I" w
0 T; t; \4 l8 g/ Y
! x9 Y7 n$ L% m' M第 2 问:( t/ C# m$ k6 r3 M" I
& ?, Y) J2 k# P% W% y# fQ:请教:MOV 中的 8 位图立即数,是怎么一回事 0xF0000001 是怎么来的
- { o* J# n- q* l/ g1 z
+ K/ ?3 O' ]) {4 U; i/ PA:是循环右移,就是一个 0—255 之间的数左移或右移偶数位的来的,也就是这个数除以 4一直除, 直到在 0-255 的范围内它是整数就说明是可以的!; o" Z+ f3 c. x9 l; k* r
/ T. G! v0 A: L u8 |
A:8 位数(0-255)循环左移或循环右移偶数位得到的,F0000001 既是 0x1F 循环右移 4 位,符合规范,所以是正确的.这样做是因为指令长度的限制,不可能把 32 位立即数放在32 位的指令中.移位偶数也是这个原因.可以看一看 ARM 体系结构(ADS 自带的英文文档)的相关部分.
3 k9 X7 }, E( \+ P7 u
/ `: ]- n6 F# V4 y9 ]" r9 I* ^9 E3 u4 t; Y! Q5 U
# Y' f- r+ x5 m5 o
第 3 问:! W* l) u4 f1 I: |9 [
2 X% M# `% X+ S+ L1 H- v5 n
Q:请教:《ARM 微控制器基础与实战》2.2.1 节关于第 2 个操作数的描述中有这么一段: #inmed_8r 常数表达式.该常数必须对应 8 位位图,即常熟是由一个 8 位的常数循环移位偶数位得到.
2 N$ \" R# O. y3 p; J5 b" P; I7 f) W" n/ j* i/ }
合法常量:0x3FC,0,0xF0000000,200,0xF0000001.7 y) C$ G; s- i! X! N) b8 O
! q# T% U; c' p" ~非法常量:0x1FE,511,0xFFFF,0x1010,0xF0000010.
/ p: l5 b9 j# j+ k5 z4 u& h7 m/ Q1 I$ E
常数表达式应用举例:: \2 X* m* J/ {$ H6 K
3 a4 u" z. g+ V4 {# Y1 W...
) F& N# [4 F$ N1 N: U; u
' `+ h, M" Y9 p( D) ~" z( T' W1 O...
* T% J% G9 K J# K
: r6 u F) A' X3 h5 ]! VLDR R0,[R1],#-4 ;读取 R1 地址上的存储器单元内容,且 R1 = R1-4
/ p+ c% l9 s- l9 O7 n# h; x5 S( g3 P; J* ^' \) r& G( G+ e5 C
' m2 X G5 t8 n' d针对这一段,我的疑问:0 n0 k" |2 q' ^
/ }. s1 c+ u% N+ n" r' y
1、即常数是由一个 8 位的常数循环移位偶数位得到,这句话如何理解?% L7 f1 W5 s$ \7 U$ o+ a
) l# g6 \" e, `# @1 ^9 T) [2、该常数必须对应 8 位位图,既然是 8 位位图,那么取值为 0-255,怎么 0x3FC 这种超出 255 的数是合法常量呢?) `, X3 L0 v5 a1 P {& c3 I c8 t2 c
6 w% c, v5 R1 P+ T3、所举例子中,合法常量和非法常量是怎么区分的 如 0x3FC 合法,而 0x1FE 却非法
( d8 i2 U/ |; G7 B$ m; s+ x) S( a! v. B- ~5 r& `
0xF0000000,0xF0000001 都合法,而 0xF0000010 又变成了非法?
0 V: `! A6 ^& s/ y# H
4 D7 S; n2 ~# L6 C* A" N0 R7 N4、对于汇编语句 LDR R0,[R1],#-4,是先将 R1 的值减 4 结果存入 R1,然后读取 R1 所指单元的 值到 R0,还是先读取 R1 到 R0,然后再将 R1 减 4 结果存入 R1% C( \ t7 g( z5 w
答: a$ w# s4 Y$ h! G5 j0 L
* [" y; l$ b8 l7 D
A:提示,任何常数都可用底数*2 的 n 次幂 来表示.
' Q) g' D8 ]2 k, M+ h; i
4 U; b% u+ h Q. H2 }3 ]1.ARM 结构中,只有 8bits 用来表示底数,因此底数必须是 8 位位图., B* ~2 _1 Z8 {$ U: q
) s1 I! O( f b
2.8 位位图循环之后得到常数,并非只能是 8 位.% f; r N# E, ~* U" X) Q) @
7 T: S6 U5 U! [$ \2 B* A+ o
3.0xF0000010 底数是 9 位,不能表示.
+ S7 A3 y s2 H: \
: `# @7 K: ]) d8 |7 k$ n: C4.LDR R0, [R1], #-4 是后索引,即先读,再减.
8 g2 w0 C- B+ c
1 e/ b% j3 m; i2 N可以看一看 ARM 体系结构对相关寻址方式的说明.
: N H7 h! E1 k* O! G4 |% B& J9 }- m. E4 b3 ~: g
/ m; ^" x! N( @% d% b3 ]& h! D; z第 4 问:, g# n4 b4 M p+ H
3 P- y; O9 Y. G7 s
Q:在程序移植的过程中,什么代码段处于什么样的模式,这可真是一个困扰人的大难题,有没有一种标志或办法能够识别"代码段处于什么样的模式"- K V5 I4 T) ]$ b3 t/ ?
( ~2 B" o' p+ N" s' _( u/ D @A:读取 CPSR ,任何时候都是可以读。. G. `" x: Y7 v" g2 V
7 m4 G6 K# X" b8 q1 y8 L/ g) B$ t/ n# V. D1 N0 w& Z
+ S9 p5 H) l n4 q3 k; e
第 5 问:2 Q; S% `& J v+ w1 o v! N
. f4 Y: a8 _8 |- T( m$ U" n
Q:为什么保护现场时,总是保护 R0-R3,R12,为什么不保护 R4-R11" M/ Y. q) s4 ^, {8 \6 D' |7 K7 K
; w4 |2 x+ z# B n7 _A:请看一看"ARM-thumb 过程调用标准"这个文档.
& h( W+ p: z& v0 A/ p. D# H$ }: y$ G5 ]3 x
# c1 \" F& s6 X) }; H" N
* q) y# P$ m3 x0 `第 6 问:
- R- |4 v5 V4 p3 A; W+ ~- f( `+ X- ]
Q:请问 mov R1,#0x00003DD0 错误 ut of the range of operation 是怎么回事情
( l% V# }& z! s" }. q5 D
/ u! M3 X- |, J/ c我就是想 IODIR=0x00003dd0,汇编就是( _$ P, I$ S+ z3 X" ^7 e. ^
: L4 R" n8 z" V4 c# pLDR R0,=IODIR3 R" B$ o; ^8 s6 i, l
0 U, v: S3 p8 X4 E% U3 _/ QMOV R1,#0x00003dd0
# H5 G6 v- X% V( o3 k$ I! i8 d, T) @5 U
STR R1,[R0]
6 \ k5 E% p% [/ F; E( _7 c) Z2 k) i+ V- z- P+ ~2 j- Z p& f
编译时候说是超出操作范围
" _% {1 Q' V9 U1 a5 \
* q+ `6 s" x) gA:使用 ldr,mov 的操作数为 8 位位图数。
. {& [% J( ^/ K
7 T8 l$ ]4 W3 F7 A- g+ Z
4 _" t8 ^# X- o$ f% S. t1 v2 ]* |- Z8 r6 _" N$ E" P7 F
第 7 问:1 b9 H! [: _3 ~. a
' `2 j: X" | ?7 m% M0 r
Q:"在 ARM7TDMI(-S)处理器内部有 37 个用户可见的寄存器:" Q6 Y" G% `% g, F3 V
. o" \3 e5 l6 d4 k' z问题:"用户可见"应该怎样理解 这 37 个寄存器是否是 37 个不同的物理寄存器,
2 y3 \% J2 u( h( b
7 ]. j* C7 T. u2 A- c$ @例如 R8 与 R8_fiq 应该是两个不同的物理寄存器吧
# q0 R$ g% A# [8 _$ Z5 l6 D) ?. |
A:用户可见是指用户可以通过程序操作的.R8 与 R8_fiq 是两个不同的寄存器.
% t3 r4 _' ?2 i% I" F
0 M6 T. p3 {) w. t: [
$ b8 B% F9 `2 o3 r4 x' E第 8 问:' `$ r2 F5 d5 d( N$ I
' l* U# l# E8 N1 ?# Q2 S, Q/ P# UQ:USR 模式,SVC 模式,IRQ 模式分别有哪些限制
: R: R8 v& ` e
5 F# O7 l! B2 @4 e) K" |A:对于外设操作限制与芯片设计有关.USR 模式不能设置 CPSR 寄存器.7 x/ q& G4 X- N& @
1 }. Q8 i5 B( o% E+ ]* ]
用户模式下无 SPSR 寄存器,代码可以为 ARM,Thumb.
0 q* U9 r2 N& v' R) t
! m/ `9 P, i5 i; D
, t( B6 H0 F+ ^6 m$ Q, B第 9 问:1 x2 _8 ]1 _; T' @
/ {% P f- w# ~' {% t
Q:请问"在初始化堆栈时就决定了工作模式"是什么意思 如何决定工作模式的
- s4 b5 N( [0 J; T
2 p; u% d) G4 m. Y' L# yA:设置 CPSR 寄存器。
; Z) R' g4 b6 V' M7 \# x% ]2 v- P* l! e- t5 f6 W1 W
第 10 问:
& c; F9 t$ W" p: \4 U
' }- `8 y8 F: W0 q7 sQ:请问:ARM 汇编程序设计中所谓的"文字池"作何理解
4 K9 w6 {( Y- R$ EA:可以理解为常量数组,文字池中保存的是常量,这些常量可以是正常的常量,也可以是地址.
+ w7 T0 l6 O' m, Y- F
) n3 E/ [- J4 ^3 ? |
|