EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
体系结构
' `" n. [1 p7 e" w+ q/ W第1 问:
* g# b& s( `3 \3 ^9 vQ:请问在初始化 CPU 堆栈的时候一开始在执行 mov r0, LR 这句指令时处理器是什么模式
$ y! ]# r% I$ T1 Z# _* {9 f. p4 lA:复位后的模式,即管理模式. 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 pA: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* B2、该常数必须对应 8 位位图,既然是 8 位位图,那么取值为 0-255,怎么 0x3FC 这种超出 255 的数是合法常量呢?
# `/ P/ D. L5 L% r3、所举例子中,合法常量和非法常量是怎么区分的 如 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 c2. 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 pQ:在程序移植的过程中,更多学习信息交流可加3311615775,什么代码段处于什么样的模式,这可真是一个困扰人的大难题,有没有一种标志或办法能够识别"代码段处于什么样的模式"
+ X( `' ~1 O4 @" E4 BA:读取 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 pQ:为什么保护现场时,总是保护 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' IQ:请问 mov R1,#0x00003DD0 错误  ut of the range of opera tion 是怎么回事情
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 rMOV 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$ DA:对于外设操作限制与芯片设计有关.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" rQ:请问: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
Q  DR 不是可以全空间跳转的吗 《ARM 微控制器基础与实战》程序清单 5.3. $ b) F# E I! l% `9 b9 T p5 ~
A  DR 伪指令通过设置指令缓冲池才能实现全范围跳转,而 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* |) EA: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 hQ  CD 伪指令的疑惑.
) 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
|