找回密码
 注册
关于网站域名变更的通知
查看: 357|回复: 0
打印 上一主题 下一主题

转载-----ARM 经典 十大问

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2017-9-27 14:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
体系结构

' `" n. [1 p7 e" w+ q/ W
第1 问:

* g# b& s( `3 \3 ^9 v
Q:请问在初始化 CPU 堆栈的时候一开始在执行 mov r0, LR 这句指令时处理器是什么模式

$ y! ]# r% I$ T1 Z# _* {9 f. p4 l
A:复位后的模式,即管理模式.
5 K$ }2 y* s1 h% t9 h
: ]9 {- F6 ~0 A' w2 z) X: n

0 _$ V% ~0 d$ b0 W+ L
2 :
( A3 _6 a4 ]8 Q6 Z
Q:请教:MOV 中的 8 位图立即数,是怎么一回事 0xF0000001 是怎么来的
+ O9 U/ Q+ h3 L" B) v: j: D
A:是循环右移,就是一个 0—255 之间的数左移或右移偶数位的来的,也就是这个数除以 4一直除, 直到在 0-255的范围内它是整数就说明是可以的!

8 E0 W0 V, t5 Z+ W  _2 p
A:8 位数(0-255)循环左移或循环右移偶数位得到的,F0000001 既是 0x1F 循环右移 4 位,符合规范,所以是正确的.这样做是因为指令长度的限制,不可能把 32 位立即数放在32 位的指令中.更多学习信息交流可加3311615775,移位偶数也是这个原因.可以看一看 ARM 体系结构(ADS 自带的英文文档)的相关部分.

- |# ?0 `  k, |1 `: r' l" n$ l- i- y

  u' V0 N/ Z, H; c8 r6 R/ \# ^. E4 `
3 :
1 w' ~! P' R& l4 @! v- b* \; E3 U
Q:请教:《ARM 微控制器基础与实战》2.2.1 节关于第 2 个操作数的描述中有这么一段: #inmed_8r 常数表达式.该常数必须对应 8 位位图,即常熟是由一个 8 位的常数循环移位偶数位得到.

7 }$ r0 n* |% l& k9 o9 \2 c
合法常量:0x3FC,0,0xF0000000,200,0xF0000001.
. F1 v& ?" ^. o- |
非法常量:0x1FE,511,0xFFFF,0x1010,0xF0000010.

/ M2 J: U8 j. o; y4 ~+ z6 Z; F" `
常数表达式应用举例:

7 K. t8 f- f4 n4 D) g# ^
...

2 x" O' W7 Y0 }& N
...
& d% J9 l( Y" @! r4 G' U# `+ c
LDR R0,[R1],#-4 ;读取 R1 地址上的存储器单元内容,且 R1 = R1-4

4 s5 v& z/ E; h* z8 \
- f# j+ R  U4 C' O- M
针对这一段,我的疑问:
9 G0 z/ g$ M' M4 M  M+ I7 I
1、即常数是由一个 8 位的常数循环移位偶数位得到,这句话如何理解?

) t: e8 M: m8 ?5 u' c8 X* B
2、该常数必须对应 8 位位图,既然是 8 位位图,那么取值为 0-255,怎么 0x3FC 这种超出 255 的数是合法常量呢

# `/ P/ D. L5 L% r
3、所举例子中,合法常量和非法常量是怎么区分的 0x3FC 合法, 0x1FE 却非法
7 x7 _* \4 E  [3 M4 q/ \! S
0xF0000000,0xF0000001 都合法,而 0xF0000010 又变成了非法?
- O, Y# t9 [  `1 ?8 _- D
[size=12.0000pt]4、对于汇编语句 LDR R0,[R1],#-4,是先将 R1 的值减 4 结果存入 R1,然后读取 R1 所指单元的值到 R0,还是先读取 R1 R0,然后再将 R1 4 结果存入 R1
答:
8 x! I# ]% \& J9 o" P8 g9 h
A:提示,任何常数都可用底数*2 的 n 次幂 来表示.

) \) |* d' [' @% `
1. ARM 结构中,只有 8bits 用来表示底数,因此底数必须是 8 位位图.

/ N. ~8 m% Y8 D4 n& A8 c
2. 8 位位图循环之后得到常数,并非只能是 8 位.
7 {- s, R3 m/ S) f- `
3. 0xF0000010 底数是 9 位,不能表示.
& ]5 J" D! r& c: E2 i8 g8 f6 S7 I0 J
4. LDR R0, [R1], #-4 是后索引,即先读,再减.

0 y+ x; M8 m  [! j" K8 G0 B  M
可以看一看 ARM 体系结构对相关寻址方式的说明.
1 D5 O" t5 E3 L4 [7 l4 ?
0 x* @$ p5 u/ U
4 :

9 b: A8 Q2 \1 p
Q:在程序移植的过程中,更多学习信息交流可加3311615775,什么代码段处于什么样的模式,这可真是一个困扰人的大难题,有没有一种标志或办法能够识别"代码段处于什么样的模式"

+ X( `' ~1 O4 @" E4 B
A:读取 CPSR ,任何时候都是可以读。
7 N4 n7 I& H3 d5 v1 {% M

' P/ f5 K2 e3 {
$ _) Y4 L/ V) ~9 B+ i5 b& t6 w# G
5 :

& ?  y  P: Y) ]- Z2 p
Q:为什么保护现场时,总是保护 R0-R3,R12,为什么不保护 R4-R11
& ~2 L) \/ R' P( h: n2 g% r+ s
A:请看一看"ARM-thumb 过程调用标准"这个文档.

7 `+ X: c# `1 s
. d, I8 G& z2 }$ l9 w- t6 g- ~& ]9 |  c' x1 z$ w& B$ x. C" B
6 :

. N) [4 h& ^, M  b" [5 {/ F+ t$ B' I
Q:请问 mov R1,#0x00003DD0 错误ut of the range of operation 是怎么回事情

5 T2 X* r' a( X1 v
我就是想 IODIR=0x00003dd0,汇编就是
7 l/ a0 s6 O' C/ j; j$ Z
LDR R0,=IODIR

# r$ N7 N- q  g& v* l: _3 r
MOV R1,#0x00003dd0

. ~- k" a8 G- k3 r% X( G8 h9 `1 @5 }
STR R1,[R0]
8 f. d  i8 d% l0 E) |, L5 k
编译时候说是超出操作范围

6 y* }- F# ?; C4 }( i5 ?
A:使用 ldr,mov 的操作数为 8 位位图数。

4 z! d" c6 y3 [) e! C* C! ]. k, @" L  h. V; p9 o/ ]

$ V: X4 Y+ P% ^% R5 S
7 :

* T: H! m1 n! }) R6 e& l- ]
Q:"在 ARM7TDMI(-S)处理器内部有 37 个用户可见的寄存器:"

$ u  N6 ^, @$ @5 X0 @# w; C
问题:"用户可见"应该怎样理解 37 个寄存器是否是 37 个不同的物理寄存器,
, i2 @* L3 v8 I! x3 ~) x7 G
例如 R8 R8_fiq 应该是两个不同的物理寄存器吧

' Q0 r* N9 O* \9 L3 b1 p9 h$ }
A:用户可见是指用户可以通过程序操作的.R8 与 R8_fiq 是两个不同的寄存器.
3 j; ^& |0 ~$ @( `: H# @

" x6 ^. m' |- Y7 i& _$ n  a
8 :
# w% ]  i7 x& Z  Y2 p
Q:USR 模式,SVC 模式,IRQ 模式分别有哪些限制

" S. q5 _( j' H* s/ H$ D
A:对于外设操作限制与芯片设计有关.USR 模式不能设置 CPSR 寄存器.

1 F' ]. R6 F) Z/ F
用户模式下无 SPSR 寄存器,代码可以为 ARM,Thumb.

0 f; s( S( [* _. N) \/ w  C# P1 R: f  a2 j
9 :
$ C6 l# I+ p) J  S6 x( O. Q2 B
Q:请问"在初始化堆栈时就决定了工作模式"是什么意思 如何决定工作模式的
$ e4 w$ f& X" h( j: i' i; I% @
A:设置 CPSR 寄存器。
  s$ f, z8 d; a' y
10 :

; d6 H: A# C6 Y7 J" r
Q:请问:ARM 汇编程序设计中所谓的"文字池"作何理解
A:可以理解为常量数组,文字池中保存的是常量,更多学习信息交流可加3311615775,这些常量可以是正常的常量,也可以是地址.

! ?, L* ^& z# L5 S* F. Q4 o& P
: C' X& R5 Z! C) Q
3 w6 V9 q6 B: c% e9 ~' {+ P
11 :
1 s1 W3 M1 U8 n
Q:为什么在中断向量表中不直接 LDR PC,"异常地址".而是使用一个标号,然有再在后面使用 DCD 定义这个标号
6 l0 r0 |% n, V# O
A:因为 LDR 指令只能跳到当前 PC 4kB 范围内,而 B 指令能跳转到 32MB 范围,而现在这样在 LDR PC, "xxxx"这条指令不远处用"xxxx"DCD 定义一个字,而这个字里面存放最终异常服务程序的地址,这样可以实现 4GB 全范围跳转.
! U2 h$ U+ Q6 X$ ~  c
QDR 不是可以全空间跳转的吗 ARM 微控制器基础与实战》程序清单 5.3.
$ b) F# E  I! l% `9 b9 T  p5 ~
ADR 伪指令通过设置指令缓冲池才能实现全范围跳转,而 LDR 指令则只能实现 4KB 范围

' }" j# U2 [" R: w! [  R9 F: O4 t- [
跳转.
+ C# N1 V/ S% A  }

! {. c+ b2 T# B0 S
: e- e& T7 P9 n& q: H- I. n0 t1 g- t
12 :
/ }+ m8 ?" i6 `" r( s
Q:ARM7TDMI-S 和 ARM7TDMI 有何区别

! w; \" F& g; z7 p" [3 N* |) E
A:ARM7TDMI-S 是 ARM7TDMI 的可综合(synthesizable)版本(软核).

2 P  p6 q1 O- a1 _
对应用工程师来说,除非芯片生产厂商对 ARM7TDMI-S 进行了裁减,
0 l0 Q* T8 _; w0 K) A% e
否则 ARM7TDMI-S ARM7TDMI 没有太大的区别,其编程模型与 ARM7TDMI 一致.

) b* }) g5 ?! j3 ], J! c- }* w: x( ~$ D& S( m* F; p
# q1 |1 k( l! @. E: v6 R3 d
13 :

* |$ O" `& u+ a. _& F  h
QCD 伪指令的疑惑.

) w0 F5 ?- e" K" y7 G
"StackUsr DCD UsrStackSpace + (USR_STACK_LEGTH - 1) * 4"

# d& h. {3 l8 d% r, \8 g, f
这句话是什么意思 DCD 后面的程序标号或数字表达式是何意
( B& D0 F5 u! s& @' i- b: p7 X
A:它的内容是初始化递减堆栈的最高地址,看《ARM 微控制器基础与实战》2.3.2 节.
; V1 U6 }- i; `. c5 G
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 13:09 , Processed in 0.156250 second(s), 25 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表