[ARM嵌入式系统结构与编程]习题答案

《ARM 嵌入式系统结构与编程》第1~4章思考与练习

题答案(此答案仅供教师教学用)

第1章 绪论

思考与练习题答案

1. 国内嵌入式系统行业对“嵌入式系统”的定义是什么?如何理解?

答:见教材1.1节。

2. 嵌入式系统是从何时产生的,简述其发展历程。

答:见教材1.1节。

3. 当前最常见的源码开放的嵌入式操作系统有哪些,请举出两例,并分析其特点。

4. 举例说明嵌入式设备在工控设备中的应用。

答:见教材1.3节的“工业控制领域”。 5. 未来嵌入式技术的发展趋势有哪些?

答:见教材1.4节的嵌入式技术的发展趋势。

思考与练习题答案

1. 简述ARM 处理器内核调试结构原理。 答:对教材1.2节的图2-1进行描述。

2. 分析ARM7TDMI-S 各字母所代表的含义。 答:参考教材2.1.2 ARM核版本命名规则说明。

第2章 ARM技术与ARM 体系结构

w

w

答:见教材1.2.1节的嵌入式Linux 和嵌入式实时操作内核µC /OS-II。

w . k

h d

a w

. c

o m

3. ARM 处理器的工作模式有哪几种,其中哪些为特权模式,哪些为异常模式,

并指出处理器在什么情况下进入相应的模式。 答:ARM 处理器共有7种工作模式:

用户模式:非特权模式,也就是正常程序执行的模式,大部分任务在这种模式下执行。在用户模式下,如果没异常发生,不允许应用程序自行改变处理器的工作模式,如果有异常发生,处理器会自动切换工作模式

FIQ 模式:也称为快速中断模式,支持高速数据传输和通道处理,当一个高优先级(fast)中断产生时将会进入这种模式。

IRQ 模式:也称为普通中断模式,:当一个低优先级中断产生时将会进入这种模式。在这模式下按中断的处理器方式又分为向量中断和非向量中断两种。通常的中

SVC 模式:称之为管理模式,它是一种操作系统保护模式。当复位或软中断指令执行时处理器将进入这种模式。 存储或存储保护。

中止模式:当存取异常时将会进入这种模式,用来处理存储器故障、实现虚拟未定义指令异常模式:当执行未定义指令时会进入这种模式,主要是用来处理未定义的指令陷阱,支持硬件协处理器的软件仿真,因为未定义指令多发生在对协处理器的操作上。 系统任务。

系统模式:使用和User 模式相同寄存器组的特权模式,用来运行特权级的操作在这7种工作模式中,除了用户模式以外,其他6种处理器模式可以称为特权模式,在这些模式下,程序可以访问所有的系统资源,也可以任意地进行处理称为异常模式

4. 分析程序状态寄存器(PSR )各位的功能描述,并说明C 、Z 、N 、V 在什答:PSR 的具体格式为

断处理都在IRQ 模式下进行。

么情况下进行置位和清零。

器模式的切换。在这6种特权模式中,除了系统模式外的其他5种特权模式又

w w

w . k

h d

a w

. c

o m

V —溢出标志位

对于加/减法运算指令,当操作数和运算结果为二进制补码表示的带符号数时,V =1表示符号位溢出,其他的指令通常不影响V 位。

例如:两个正数(最高位为0)相加,运算结果为一个负数(最高位为1),则符号位溢出,相应V=1。 C —进位或借位标志位

对于加法指令(包括比较指令CMN ),结果产生进位,则C =1,表示无符号数运算发生上溢出,其他情况下C =0;

在减法指令中(包括比较指令CMP ),结果产生借位,则C =0,表示无符号数运算发生下溢出,其他情况下C =1;

对于包含移位操作的非加/减法运算指令,C 中包含最后一次溢出位的数值; 对于其他非加/减法运算指令,C 位的值通常不受影响。 Z —结果为0标志位

Z =1表示运算结果是0,Z =0表示运算结果不是零; 对于CMP 指令,Z =1表示进行比较的两个数大小相等。 N—T符号标志位

本位设置成当前指令运算结果的bit[31]的值。当两个补码表示有符号整数运算时,N =1表示运算的结果为负数,N =0 表示结果为正数或零。

5. 简述ARM 处理器异常处理和程序返回的过程。

答:ARM在异常产生时会进行以下操作:

常处理程序执行完后能根据LR 中的值正确返回;

(3) 根据异常类型将CPSR 模式控制位强制设定为发生异常所对应的模式

值;

(4) 强制PC 指向相应的异常向量地址。

ARM 在异常返回时

(1) 从 SPSR_恢复CPSR;

(2) 从LR_恢复PC 。

6. ARM 处理器字数据的存储格式有哪两种?并指出这两种格式的区别。 答:

(1) 小端存储格式(Little-Endian )

在小端存储格式中,对于地址为A 的字单元,其中字节单元由低位到高位字节地址顺序为A,A+1,A+2,A+3;对于地址为A 的半字单元,其中字节单元由低位到高位字节地址顺序为A,A+1;

(2) 大端存储格式(Big-Endian )

在大端存储格式中,对于地址为A 的字单元,其中字节单元由高位到低位字节地

(2) 将CPSR 的内容复制到新的异常模式下的SPSR 中;

w

w

(1) 将引起异常指令的下一条指令地址保存到新的异常模式的LR 中,使异

w . k

h d

a w

. c

o m

址顺序为A,A+1,A+2,A+3;对于地址为A 的半字单元,其中字节单元由高位到低位字节地址顺序为A,A+1。

7. 分析带有存储器访问指令(LDR )的流水线运行情况,并用图示说明其流

水线的运行机制。

答:在ARM 三级流水线下:

对存储器的访问指令LDR 就是非单周期指令。这类指令在“执行”阶段后,还要进行“存储器访问”和“寄存器回写”操作,每一步占用1个时钟周期。在指令执行时空图中,处于时钟周期T5时,LDR 指令要进行数据的存储器操作(访存),在时钟周期T6要进行寄存器的回写操作,这两步还要占用执行单元,因此其下1条指令的“执行”就被阻断了,其下数第2条指令的译码被阻断,要等待LDR 指令操作完毕后,流水线的正常运行才能被恢复。

w w

w . k

h d

a w

. c

o m

8. 简述ARM9的5级流水线每一级所完成的功能和实现的操作。 答:在ARM9在指令操作上采用5级流水线。

钟周期。

在图中,处理器用6个时钟周期执行了4条指令,指令平均周期数 (CPI) = 1.5 时

(1) 取指:从指令Cache 中读取指令。

(2) 译码:对指令进行译码,识别出是对哪个寄存器进行操作并从通用寄存

器中读取操作数。

(3) 执行:进行ALU 运算和移位操作,如果是对存储器操作的指令,则在

ALU 中计算出要访问的存储器地址。

(4) 存储器访问:如果是对存储器访问的指令,用来实现数据缓冲功能(通

过数据Cache );如果不是对存储器访问的指令,本级流水线为一个空的时钟周期。

寄存器回写:将指令运算或操作结果写回到目标寄存器中。

9. 什么叫做流水线互锁?应如何来解决,举例说明。

答:

在流水线运行过程中可能会出现这种情况:当前指令的执行可能需要前面指令的执行结果,但这时前面的指令没有执行完毕,从而会导致当前指令的执行无法获

举例:参见教材第29页:

得合法的操作数,这时就会引起流水线的等待,这种现象在流水线机制里称为互锁。

当互锁发生时,硬件会停止这个指令的执行,直到数据准备好为止。如图所示,还需要两个时钟周期来完成存储器访问和寄存器写操作,LDR 指令进行完执行阶段,

因此MOV 要进行等待,直到LDR 指令的寄存器写操作完成。

w

w

但这时指令MOV 中用到的R9正是LDR 中需要进行寄存器加载操作后的寄存器,

w . k

h d

a w

. c

o m

第3章 ARM指令集寻址方式

思考与练习题答案

1. 在指令编码中,条件码占有几位,最多有多少个条件,各个条件是如何形成的?

答:见教材3.1节的描述。

2. 指令条件码中,V 标志位在什么情况下才能等于1?

答:当指令的算术运算发生异常时,V 标志位置1。例如,两个正数相加,其结果为一负数;或者是两个负数相加,其结果为一正数,都会置V 标志位。

3. 在ARM 指令中,什么是合法的立即数?判断下面各立即数是否合法,如果合

法则写出在指令中的编码格式(也就是8位常数和4位的移位数)。 0x5430 0x108 0x304 0x501 0xFB10000 0x334000 0x3FC000 0x1FE0000 0x5580000 0x7F800 0x39C000 0x1FE80000

答:每个立即数由一个8位的常数进行32位循环右移偶数位得到,其中循环右移的位数由一个4位二进制的两倍表示。即:

=immed_8进行32位循环右移(2*rotate_4)位

符合这一条件的都为合法的立即数。 1) 0x5430

0B 0101 0100 0011 0000 不合法 2) 0x108

0B 0001 0000 1000 1111 01000010(30/2) 3) 0x304

0B 0011 0000 0100 1111 11000001(30/2) 4) 0x501

不合法 0B 0101 0000 0001

5) 0xFB10000

0B 1111 1011 0001 0000 0000 0000 不合法 6) 0x334000

0B 0011 0011 0100 0000 0000 0000 1001 11001101(18/2) 7) 0x3FC000

0B 0011 1111 0000 0000 0000 1010 00111111(18/2) 8) 0x1FE0000

不合法 0B 0001 1111 1110 (0000)[4]

9) 0x5580000

不合法 0B 0101 0101 1000 (0000)[4]

10) 0x7F80000

不合法 0B 0111 1000 0001 (0000)[4]

11) 0x39C000

0B 0011 1001 1100 0000 0000 0000 1001 11100111(18/2) 12) 0x1FE80000

不合法 0B 0001 1111 1110 (0000)[4]

4. 分析逻辑右移、算术右移、循环右移、带扩展的循环右移它们间的差别。

答:见教材3.2节的图3-1移位操作功能描述。

5. ARM 数据处理指令具体的寻址方式有哪些,如果程序计数器PC 作为目标寄存

w w

w . k

h d

a w

. c

o m

器,会产生什么结果?

答:ARM 数据处理指令具体的寻址方式有5种,见教材3.2节的具体说明。 如果程序计数器PC 作为目标寄存器,会产生程序发生跳转。

6. 在Load/Store指令寻址中,字、无符号字节的Load/Store指令寻址和半字、有

符号字节寻址,试分析它们之间的差别。

答:在Load/Store指令寻址中,字、无符号字节的Load/Store指令寻址有三种,具体见教材3.3.2节;

在Load/Store指令寻址中,半字、有符号字节寻址有两种,具体见教材3.3.3节;

它们之间的差别:在半字、有符号字节寻址中,没有Addressing_mode中的偏移量通过寄存器移位得到的形式。

7. 块拷贝Load/Store指令在实现寄存器组和连续的内存单元中数据传递时,地址

的变化方式有哪几种类型,并分析它们的地址变化情况。 答:

批量Load/Store指令在实现寄存器组和连续的内存单元中数据传递时,地址的变化方式(addr_mode)有以下4种类型:

后增IA (Increment After) :每次数据传送后地址加4; 先增IB (Increment Before) :每次数据传送前地址加4 ; 后减DA (Decrement After) :每次数据传送后地址减4 ; 先减DB (Decrement Before) :每次数据传送前地址减4 。

8. 栈操作指令地址的变化方式有哪几种类型,并分析它们的地址变化情况,从而

得出栈操作指令寻址和块拷贝Load/Store指令之间的对应关系。 答:

(1) 四种类型的堆栈工作方式,即:

满递增堆栈FA(Empty Ascending):堆栈指针指向最后压入的数据,且由低地址向高地址生成。

满递减堆栈FD (Full Descending):堆栈指针指向最后压入的数据,且由高地址向低地址生成。

空递增堆栈EA(Full Ascending):堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。

空递减堆栈ED(Empty Descending):堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。

(2) 栈操作指令寻址和块拷贝Load/Store指令之间的对应关系见表3-10。

9. 分析协处理器加载/存储指令的寻址方式中的内存地址索引格式中不同的汇编语

法格式下内存地址的计算方法。 答:具体见教材3.3.2节

10. 写出下列指令的机器码,并分析指令操作功能。

MOV R0,R1 MOV R1,#0x198

ADDEQS R1,R2,#0xAB

w w

w . k

h d

a w

. c

o m

CMP R2,#0Xab

LDR R0,[R1,#4] STR R0,[R1,R1,LSL #2]! LDRH R0,[R1,#4] LDRSB R0,[R2,#-2]! STRB R1,[R2,#0xA0] LDMIA R0,{R1,R2,R8} STMDB R0!,{R1-R5,R10,R11} STMED SP !,{R0-R3,LR}

答:现对以下三条指令进行编码,其余的参照本章的编码说明。

w . k

课后答

思考与练习题答案

1. ARM 指令可分为哪几类?说出哪几条指令是无条件执行的。 答:ARM 指令可分为:

z 数据处理指令

z 程序状态寄存器与通用寄存器之间的传送指令 z Load/Store 指令 z 转移指令

z 异常中断指令 z 协处理器指令

无条件执行指令:BLX ,BKPT

2. 如何实现两个64位数的加法操作,如何实现两个64位数的减法操作,如何求

一个64位数的负数? 答:(1)见教材例4-4:

实现64位数据加法运算: 假设R0和R1存放了一个64位数据(作为被加数),

第4章 ARM指令集系统

w

w

h d

a w

. c

o m

R0存放数据的低32位;R2和R3中存放了另一个64位数据(作为加数),R2中存放低32位数据。运算结果送回到[R1:R0]中(R0中存放低32位)。

ADDS R0,R0,R2 ;低落32位相加并影响标志位

ADC R1,R1,R3 ;高32位相加再加上C 标志位 (进位值)

(2)见教材例4-6:

SBC 指令和SUBS 指令联合使用可以实现两个64位的操作数相减。如果寄存器R0和R1中放置一个64位的被减数,其中R0中放置低32位数值;寄存器R2和R3中放置一个64位的减数,其中R2中放置低32位数值。运算结果送回到[R1:R0]中(R0中存放低32位)。 SUBS R0,R0,R2 ; 低32位相减并影响标志位 SBC R1,R1,R3 ; 高32位相减再减去C 标志位的反码

(3)见教材例4-8:

如果寄存器R0和R1中放置一个64位数,其中R0中放置低32位数值;寄存器R4和R5中放置其负数,其中R4中放置低32位数值。

RSBS R4,R0,#0 ; 0减去低32位并影响标志位 RSC R5,R1,#0 ; 0减去高32位再减去C 标志位的反码

3. 写出LDRB 指令与LDRSB 指令二进制编码格式,并指出它们之间的区别。 答:提示:LDRB 指令与LDRSB 指令编码的符号不同,在功能上LDRB 所加载的寄存器高24位清0,而LDRSB 则是用符号位扩展。

4. 分析下列每条语句的功能,并确定程序段所实现的操作。

CMP R0,#0 MOVEQ R1,#0 MOVGT R1,#1 答:分析:

当R0等于0时,MOVEQ 执行,则R1等于0; 当R0等于正数时,MOVGT 执行,则R1等于1; 此功能码段可以判别R0中的值为正数还是0。

5. 请使用多种方法实现将字数据0xFFFFFFFF 送入寄存器R0。 答:

例如,MVN R0,#0 或者: MOV R0,#0 SUB R0,R0,#1

还可以用其它运算指令来实现,读者自行写出。

6. 写一条 ARM 指令,分别完成下列操作: a) R0 = 16 b) R0 = R1 / 16 (带符号的数字) c) R1 = R2 * 3

w

w

w . k

h d

a w

. c

o m

d) R0 = -R0 答:

a) R0 = 16

MOV R0, 0x10

b) R0 = R1 / 16 (带符号的数字)

MOV R0, R1, ASR #4 c) R1 = R2 * 3

ADD R1, R2, R2, LSL #1 d) R0 = -R0

RSB R0, R0, #0

7. 编写一个ARM 汇编程序,累加一个队列中的所有元素,碰上0时停止。结果

放入 R4。 解答:(参考程序)

/*----------------------------------------------- 寄存器的使用说明: * R0: 队列指针 * R1: 加载队列中的数据 * R4: 队列数据的累加结果

*-----------------------------------------------*/ .global start .text start:

LDR R0, =DataZone @ 初始化为队列的起始地址 MOV R4, #0 @ 结果寄存器初始化为0 addNum:

LDRB R1, [R0], #1 @ 加载队列中的数据存入R1中 CMP R1, #0 @ 判断R1的值是否为0 BLS stop @ 如果R1的值小于或等于0则停止累加 ADD R4, R4, R1 @ 累加求和 B addNum @ 继续循环 stop: B . DataZone: .space 10, 0x10 @ 在存储单元中申请10个字节的连续空间并用0x10填充 .zero 5 @ 在存储单元中申请5个字节的连续空间并用0填充 .end

8. 写出实现下列操作的ARM 指令:

当Z=1时,将存储器地址为R1的字数据读入寄存器R0。 当Z=1时,将存储器地址为R1+R2的字数据读入寄存器R0。 将存储器地址为R1-4的字数据读入寄存器R0。 将存储器地址为R1+R6的字数据读入寄存器R0,并将新地址R1+R6写入R1。

w w

w . k

h d

a w

. c

o m

解答:

(1) MOVEQ R0, R1

(2) LDREQ R0, [R1,R2] (3) LDR R0,[R1,#-4] (4) LDR R0 [R1,R6]!

9. 写出下列ARM 指令所实现操作:

LDR R2,[R3,#-4] ! LDR R0,[R0],R2

LDR R1,[R3,R2,LSL #2]!; LDRSB R0,[R2,#-2]! STRB R1,[R2,#0xA0] LDMIA R0,{R1,R2,R8} STMDB R0!,{R1-R5,R10,R11} 解答:

LDR R2,[R3,#-4]!

将存储器地址为R3-4的字数据读入R2,并将地址R3-4写入R3 LDR R0,[R0],R2

将存储器地址为R0的字数据读入R0,并将地址R0+R2写入R0 LDR R1,[R3,R2,LSL#2]!

将存储器地址为R3+R2*4的字数据读入R1,并将地址R3+R2*4写入R3 LDRSB R0,[R2,#-2]!

将存储器地址为R2-2的字节数据读入R0的低8位,将R0的高24位用符号位扩展,并将地址R2-2写入R2 STRB R1,[R2,#0xA0]

将R0的低8位存入存储器地址为R2+0xA0字节中 LDMIA R0,{R1,R2,R8}

将内存单元R0所指向的地址单元以字为单位递减方式读取到R1,R2,R8中,低地址编号的字数据内存单元对应低编号寄存器 STMDB R0! {R1-R5,R10,R11}

最终R0指向存放R11将R1-R5,R10,R11存储到以R0为起始地址的递减内存中,

的地址单元

10. SWP 指令的优势是什么? 答:

ARM 指令支持原子操作,主要是用来对信号量的操作,因为信号量操作的要求是作原子操作,即在一条指令中完成信号量的读取和修改操作。SWP 数据交换指令就能完成此功能,能在一条指令中实现存储器和寄存器之间交换数据。

11. 如何用带PSR 操作的批量字数据加载指令实现IRQ 中断的返回?

答:见教材例4-31

w w

w . k

h d

a w

. c

o m

在进入IRQ 中断处理程序时,首先计算返回地址,并保存相关的寄存器 SUB R14,R14,#4 ; STMFD R13!, {R0-R3, R12, LR} ;

如果IRQ 中断处理程序返回到被中断的进程则执行下面的指令。该指令从数据栈中恢复寄存器R0~R3及R12的值,将返回地址传送到PC 中,并将SPSR_irq值复制到CPSR 中

LDMFD R13!, {R0-R3, R12, PC}^

12. 用ARM 汇编语言编写代码,实现将ARM 处理器切换到用户模式,并关闭中断。

.equ User_Mode, 0x10 .equ Mode_Mask 0x1F .equ NOINT, 0xC0 MRS R0, CPSR BIC R0, R0, #Mode_Mask ORR R1, R0, #User_Mode | NOINT MSR CPSR_cxsf, R1

@读CPSR @修改

@进入用户模式

w w

w . k

h d

a w

. c

o m

《ARM 嵌入式系统结构与编程》第1~4章思考与练习

题答案(此答案仅供教师教学用)

第1章 绪论

思考与练习题答案

1. 国内嵌入式系统行业对“嵌入式系统”的定义是什么?如何理解?

答:见教材1.1节。

2. 嵌入式系统是从何时产生的,简述其发展历程。

答:见教材1.1节。

3. 当前最常见的源码开放的嵌入式操作系统有哪些,请举出两例,并分析其特点。

4. 举例说明嵌入式设备在工控设备中的应用。

答:见教材1.3节的“工业控制领域”。 5. 未来嵌入式技术的发展趋势有哪些?

答:见教材1.4节的嵌入式技术的发展趋势。

思考与练习题答案

1. 简述ARM 处理器内核调试结构原理。 答:对教材1.2节的图2-1进行描述。

2. 分析ARM7TDMI-S 各字母所代表的含义。 答:参考教材2.1.2 ARM核版本命名规则说明。

第2章 ARM技术与ARM 体系结构

w

w

答:见教材1.2.1节的嵌入式Linux 和嵌入式实时操作内核µC /OS-II。

w . k

h d

a w

. c

o m

3. ARM 处理器的工作模式有哪几种,其中哪些为特权模式,哪些为异常模式,

并指出处理器在什么情况下进入相应的模式。 答:ARM 处理器共有7种工作模式:

用户模式:非特权模式,也就是正常程序执行的模式,大部分任务在这种模式下执行。在用户模式下,如果没异常发生,不允许应用程序自行改变处理器的工作模式,如果有异常发生,处理器会自动切换工作模式

FIQ 模式:也称为快速中断模式,支持高速数据传输和通道处理,当一个高优先级(fast)中断产生时将会进入这种模式。

IRQ 模式:也称为普通中断模式,:当一个低优先级中断产生时将会进入这种模式。在这模式下按中断的处理器方式又分为向量中断和非向量中断两种。通常的中

SVC 模式:称之为管理模式,它是一种操作系统保护模式。当复位或软中断指令执行时处理器将进入这种模式。 存储或存储保护。

中止模式:当存取异常时将会进入这种模式,用来处理存储器故障、实现虚拟未定义指令异常模式:当执行未定义指令时会进入这种模式,主要是用来处理未定义的指令陷阱,支持硬件协处理器的软件仿真,因为未定义指令多发生在对协处理器的操作上。 系统任务。

系统模式:使用和User 模式相同寄存器组的特权模式,用来运行特权级的操作在这7种工作模式中,除了用户模式以外,其他6种处理器模式可以称为特权模式,在这些模式下,程序可以访问所有的系统资源,也可以任意地进行处理称为异常模式

4. 分析程序状态寄存器(PSR )各位的功能描述,并说明C 、Z 、N 、V 在什答:PSR 的具体格式为

断处理都在IRQ 模式下进行。

么情况下进行置位和清零。

器模式的切换。在这6种特权模式中,除了系统模式外的其他5种特权模式又

w w

w . k

h d

a w

. c

o m

V —溢出标志位

对于加/减法运算指令,当操作数和运算结果为二进制补码表示的带符号数时,V =1表示符号位溢出,其他的指令通常不影响V 位。

例如:两个正数(最高位为0)相加,运算结果为一个负数(最高位为1),则符号位溢出,相应V=1。 C —进位或借位标志位

对于加法指令(包括比较指令CMN ),结果产生进位,则C =1,表示无符号数运算发生上溢出,其他情况下C =0;

在减法指令中(包括比较指令CMP ),结果产生借位,则C =0,表示无符号数运算发生下溢出,其他情况下C =1;

对于包含移位操作的非加/减法运算指令,C 中包含最后一次溢出位的数值; 对于其他非加/减法运算指令,C 位的值通常不受影响。 Z —结果为0标志位

Z =1表示运算结果是0,Z =0表示运算结果不是零; 对于CMP 指令,Z =1表示进行比较的两个数大小相等。 N—T符号标志位

本位设置成当前指令运算结果的bit[31]的值。当两个补码表示有符号整数运算时,N =1表示运算的结果为负数,N =0 表示结果为正数或零。

5. 简述ARM 处理器异常处理和程序返回的过程。

答:ARM在异常产生时会进行以下操作:

常处理程序执行完后能根据LR 中的值正确返回;

(3) 根据异常类型将CPSR 模式控制位强制设定为发生异常所对应的模式

值;

(4) 强制PC 指向相应的异常向量地址。

ARM 在异常返回时

(1) 从 SPSR_恢复CPSR;

(2) 从LR_恢复PC 。

6. ARM 处理器字数据的存储格式有哪两种?并指出这两种格式的区别。 答:

(1) 小端存储格式(Little-Endian )

在小端存储格式中,对于地址为A 的字单元,其中字节单元由低位到高位字节地址顺序为A,A+1,A+2,A+3;对于地址为A 的半字单元,其中字节单元由低位到高位字节地址顺序为A,A+1;

(2) 大端存储格式(Big-Endian )

在大端存储格式中,对于地址为A 的字单元,其中字节单元由高位到低位字节地

(2) 将CPSR 的内容复制到新的异常模式下的SPSR 中;

w

w

(1) 将引起异常指令的下一条指令地址保存到新的异常模式的LR 中,使异

w . k

h d

a w

. c

o m

址顺序为A,A+1,A+2,A+3;对于地址为A 的半字单元,其中字节单元由高位到低位字节地址顺序为A,A+1。

7. 分析带有存储器访问指令(LDR )的流水线运行情况,并用图示说明其流

水线的运行机制。

答:在ARM 三级流水线下:

对存储器的访问指令LDR 就是非单周期指令。这类指令在“执行”阶段后,还要进行“存储器访问”和“寄存器回写”操作,每一步占用1个时钟周期。在指令执行时空图中,处于时钟周期T5时,LDR 指令要进行数据的存储器操作(访存),在时钟周期T6要进行寄存器的回写操作,这两步还要占用执行单元,因此其下1条指令的“执行”就被阻断了,其下数第2条指令的译码被阻断,要等待LDR 指令操作完毕后,流水线的正常运行才能被恢复。

w w

w . k

h d

a w

. c

o m

8. 简述ARM9的5级流水线每一级所完成的功能和实现的操作。 答:在ARM9在指令操作上采用5级流水线。

钟周期。

在图中,处理器用6个时钟周期执行了4条指令,指令平均周期数 (CPI) = 1.5 时

(1) 取指:从指令Cache 中读取指令。

(2) 译码:对指令进行译码,识别出是对哪个寄存器进行操作并从通用寄存

器中读取操作数。

(3) 执行:进行ALU 运算和移位操作,如果是对存储器操作的指令,则在

ALU 中计算出要访问的存储器地址。

(4) 存储器访问:如果是对存储器访问的指令,用来实现数据缓冲功能(通

过数据Cache );如果不是对存储器访问的指令,本级流水线为一个空的时钟周期。

寄存器回写:将指令运算或操作结果写回到目标寄存器中。

9. 什么叫做流水线互锁?应如何来解决,举例说明。

答:

在流水线运行过程中可能会出现这种情况:当前指令的执行可能需要前面指令的执行结果,但这时前面的指令没有执行完毕,从而会导致当前指令的执行无法获

举例:参见教材第29页:

得合法的操作数,这时就会引起流水线的等待,这种现象在流水线机制里称为互锁。

当互锁发生时,硬件会停止这个指令的执行,直到数据准备好为止。如图所示,还需要两个时钟周期来完成存储器访问和寄存器写操作,LDR 指令进行完执行阶段,

因此MOV 要进行等待,直到LDR 指令的寄存器写操作完成。

w

w

但这时指令MOV 中用到的R9正是LDR 中需要进行寄存器加载操作后的寄存器,

w . k

h d

a w

. c

o m

第3章 ARM指令集寻址方式

思考与练习题答案

1. 在指令编码中,条件码占有几位,最多有多少个条件,各个条件是如何形成的?

答:见教材3.1节的描述。

2. 指令条件码中,V 标志位在什么情况下才能等于1?

答:当指令的算术运算发生异常时,V 标志位置1。例如,两个正数相加,其结果为一负数;或者是两个负数相加,其结果为一正数,都会置V 标志位。

3. 在ARM 指令中,什么是合法的立即数?判断下面各立即数是否合法,如果合

法则写出在指令中的编码格式(也就是8位常数和4位的移位数)。 0x5430 0x108 0x304 0x501 0xFB10000 0x334000 0x3FC000 0x1FE0000 0x5580000 0x7F800 0x39C000 0x1FE80000

答:每个立即数由一个8位的常数进行32位循环右移偶数位得到,其中循环右移的位数由一个4位二进制的两倍表示。即:

=immed_8进行32位循环右移(2*rotate_4)位

符合这一条件的都为合法的立即数。 1) 0x5430

0B 0101 0100 0011 0000 不合法 2) 0x108

0B 0001 0000 1000 1111 01000010(30/2) 3) 0x304

0B 0011 0000 0100 1111 11000001(30/2) 4) 0x501

不合法 0B 0101 0000 0001

5) 0xFB10000

0B 1111 1011 0001 0000 0000 0000 不合法 6) 0x334000

0B 0011 0011 0100 0000 0000 0000 1001 11001101(18/2) 7) 0x3FC000

0B 0011 1111 0000 0000 0000 1010 00111111(18/2) 8) 0x1FE0000

不合法 0B 0001 1111 1110 (0000)[4]

9) 0x5580000

不合法 0B 0101 0101 1000 (0000)[4]

10) 0x7F80000

不合法 0B 0111 1000 0001 (0000)[4]

11) 0x39C000

0B 0011 1001 1100 0000 0000 0000 1001 11100111(18/2) 12) 0x1FE80000

不合法 0B 0001 1111 1110 (0000)[4]

4. 分析逻辑右移、算术右移、循环右移、带扩展的循环右移它们间的差别。

答:见教材3.2节的图3-1移位操作功能描述。

5. ARM 数据处理指令具体的寻址方式有哪些,如果程序计数器PC 作为目标寄存

w w

w . k

h d

a w

. c

o m

器,会产生什么结果?

答:ARM 数据处理指令具体的寻址方式有5种,见教材3.2节的具体说明。 如果程序计数器PC 作为目标寄存器,会产生程序发生跳转。

6. 在Load/Store指令寻址中,字、无符号字节的Load/Store指令寻址和半字、有

符号字节寻址,试分析它们之间的差别。

答:在Load/Store指令寻址中,字、无符号字节的Load/Store指令寻址有三种,具体见教材3.3.2节;

在Load/Store指令寻址中,半字、有符号字节寻址有两种,具体见教材3.3.3节;

它们之间的差别:在半字、有符号字节寻址中,没有Addressing_mode中的偏移量通过寄存器移位得到的形式。

7. 块拷贝Load/Store指令在实现寄存器组和连续的内存单元中数据传递时,地址

的变化方式有哪几种类型,并分析它们的地址变化情况。 答:

批量Load/Store指令在实现寄存器组和连续的内存单元中数据传递时,地址的变化方式(addr_mode)有以下4种类型:

后增IA (Increment After) :每次数据传送后地址加4; 先增IB (Increment Before) :每次数据传送前地址加4 ; 后减DA (Decrement After) :每次数据传送后地址减4 ; 先减DB (Decrement Before) :每次数据传送前地址减4 。

8. 栈操作指令地址的变化方式有哪几种类型,并分析它们的地址变化情况,从而

得出栈操作指令寻址和块拷贝Load/Store指令之间的对应关系。 答:

(1) 四种类型的堆栈工作方式,即:

满递增堆栈FA(Empty Ascending):堆栈指针指向最后压入的数据,且由低地址向高地址生成。

满递减堆栈FD (Full Descending):堆栈指针指向最后压入的数据,且由高地址向低地址生成。

空递增堆栈EA(Full Ascending):堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。

空递减堆栈ED(Empty Descending):堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。

(2) 栈操作指令寻址和块拷贝Load/Store指令之间的对应关系见表3-10。

9. 分析协处理器加载/存储指令的寻址方式中的内存地址索引格式中不同的汇编语

法格式下内存地址的计算方法。 答:具体见教材3.3.2节

10. 写出下列指令的机器码,并分析指令操作功能。

MOV R0,R1 MOV R1,#0x198

ADDEQS R1,R2,#0xAB

w w

w . k

h d

a w

. c

o m

CMP R2,#0Xab

LDR R0,[R1,#4] STR R0,[R1,R1,LSL #2]! LDRH R0,[R1,#4] LDRSB R0,[R2,#-2]! STRB R1,[R2,#0xA0] LDMIA R0,{R1,R2,R8} STMDB R0!,{R1-R5,R10,R11} STMED SP !,{R0-R3,LR}

答:现对以下三条指令进行编码,其余的参照本章的编码说明。

w . k

课后答

思考与练习题答案

1. ARM 指令可分为哪几类?说出哪几条指令是无条件执行的。 答:ARM 指令可分为:

z 数据处理指令

z 程序状态寄存器与通用寄存器之间的传送指令 z Load/Store 指令 z 转移指令

z 异常中断指令 z 协处理器指令

无条件执行指令:BLX ,BKPT

2. 如何实现两个64位数的加法操作,如何实现两个64位数的减法操作,如何求

一个64位数的负数? 答:(1)见教材例4-4:

实现64位数据加法运算: 假设R0和R1存放了一个64位数据(作为被加数),

第4章 ARM指令集系统

w

w

h d

a w

. c

o m

R0存放数据的低32位;R2和R3中存放了另一个64位数据(作为加数),R2中存放低32位数据。运算结果送回到[R1:R0]中(R0中存放低32位)。

ADDS R0,R0,R2 ;低落32位相加并影响标志位

ADC R1,R1,R3 ;高32位相加再加上C 标志位 (进位值)

(2)见教材例4-6:

SBC 指令和SUBS 指令联合使用可以实现两个64位的操作数相减。如果寄存器R0和R1中放置一个64位的被减数,其中R0中放置低32位数值;寄存器R2和R3中放置一个64位的减数,其中R2中放置低32位数值。运算结果送回到[R1:R0]中(R0中存放低32位)。 SUBS R0,R0,R2 ; 低32位相减并影响标志位 SBC R1,R1,R3 ; 高32位相减再减去C 标志位的反码

(3)见教材例4-8:

如果寄存器R0和R1中放置一个64位数,其中R0中放置低32位数值;寄存器R4和R5中放置其负数,其中R4中放置低32位数值。

RSBS R4,R0,#0 ; 0减去低32位并影响标志位 RSC R5,R1,#0 ; 0减去高32位再减去C 标志位的反码

3. 写出LDRB 指令与LDRSB 指令二进制编码格式,并指出它们之间的区别。 答:提示:LDRB 指令与LDRSB 指令编码的符号不同,在功能上LDRB 所加载的寄存器高24位清0,而LDRSB 则是用符号位扩展。

4. 分析下列每条语句的功能,并确定程序段所实现的操作。

CMP R0,#0 MOVEQ R1,#0 MOVGT R1,#1 答:分析:

当R0等于0时,MOVEQ 执行,则R1等于0; 当R0等于正数时,MOVGT 执行,则R1等于1; 此功能码段可以判别R0中的值为正数还是0。

5. 请使用多种方法实现将字数据0xFFFFFFFF 送入寄存器R0。 答:

例如,MVN R0,#0 或者: MOV R0,#0 SUB R0,R0,#1

还可以用其它运算指令来实现,读者自行写出。

6. 写一条 ARM 指令,分别完成下列操作: a) R0 = 16 b) R0 = R1 / 16 (带符号的数字) c) R1 = R2 * 3

w

w

w . k

h d

a w

. c

o m

d) R0 = -R0 答:

a) R0 = 16

MOV R0, 0x10

b) R0 = R1 / 16 (带符号的数字)

MOV R0, R1, ASR #4 c) R1 = R2 * 3

ADD R1, R2, R2, LSL #1 d) R0 = -R0

RSB R0, R0, #0

7. 编写一个ARM 汇编程序,累加一个队列中的所有元素,碰上0时停止。结果

放入 R4。 解答:(参考程序)

/*----------------------------------------------- 寄存器的使用说明: * R0: 队列指针 * R1: 加载队列中的数据 * R4: 队列数据的累加结果

*-----------------------------------------------*/ .global start .text start:

LDR R0, =DataZone @ 初始化为队列的起始地址 MOV R4, #0 @ 结果寄存器初始化为0 addNum:

LDRB R1, [R0], #1 @ 加载队列中的数据存入R1中 CMP R1, #0 @ 判断R1的值是否为0 BLS stop @ 如果R1的值小于或等于0则停止累加 ADD R4, R4, R1 @ 累加求和 B addNum @ 继续循环 stop: B . DataZone: .space 10, 0x10 @ 在存储单元中申请10个字节的连续空间并用0x10填充 .zero 5 @ 在存储单元中申请5个字节的连续空间并用0填充 .end

8. 写出实现下列操作的ARM 指令:

当Z=1时,将存储器地址为R1的字数据读入寄存器R0。 当Z=1时,将存储器地址为R1+R2的字数据读入寄存器R0。 将存储器地址为R1-4的字数据读入寄存器R0。 将存储器地址为R1+R6的字数据读入寄存器R0,并将新地址R1+R6写入R1。

w w

w . k

h d

a w

. c

o m

解答:

(1) MOVEQ R0, R1

(2) LDREQ R0, [R1,R2] (3) LDR R0,[R1,#-4] (4) LDR R0 [R1,R6]!

9. 写出下列ARM 指令所实现操作:

LDR R2,[R3,#-4] ! LDR R0,[R0],R2

LDR R1,[R3,R2,LSL #2]!; LDRSB R0,[R2,#-2]! STRB R1,[R2,#0xA0] LDMIA R0,{R1,R2,R8} STMDB R0!,{R1-R5,R10,R11} 解答:

LDR R2,[R3,#-4]!

将存储器地址为R3-4的字数据读入R2,并将地址R3-4写入R3 LDR R0,[R0],R2

将存储器地址为R0的字数据读入R0,并将地址R0+R2写入R0 LDR R1,[R3,R2,LSL#2]!

将存储器地址为R3+R2*4的字数据读入R1,并将地址R3+R2*4写入R3 LDRSB R0,[R2,#-2]!

将存储器地址为R2-2的字节数据读入R0的低8位,将R0的高24位用符号位扩展,并将地址R2-2写入R2 STRB R1,[R2,#0xA0]

将R0的低8位存入存储器地址为R2+0xA0字节中 LDMIA R0,{R1,R2,R8}

将内存单元R0所指向的地址单元以字为单位递减方式读取到R1,R2,R8中,低地址编号的字数据内存单元对应低编号寄存器 STMDB R0! {R1-R5,R10,R11}

最终R0指向存放R11将R1-R5,R10,R11存储到以R0为起始地址的递减内存中,

的地址单元

10. SWP 指令的优势是什么? 答:

ARM 指令支持原子操作,主要是用来对信号量的操作,因为信号量操作的要求是作原子操作,即在一条指令中完成信号量的读取和修改操作。SWP 数据交换指令就能完成此功能,能在一条指令中实现存储器和寄存器之间交换数据。

11. 如何用带PSR 操作的批量字数据加载指令实现IRQ 中断的返回?

答:见教材例4-31

w w

w . k

h d

a w

. c

o m

在进入IRQ 中断处理程序时,首先计算返回地址,并保存相关的寄存器 SUB R14,R14,#4 ; STMFD R13!, {R0-R3, R12, LR} ;

如果IRQ 中断处理程序返回到被中断的进程则执行下面的指令。该指令从数据栈中恢复寄存器R0~R3及R12的值,将返回地址传送到PC 中,并将SPSR_irq值复制到CPSR 中

LDMFD R13!, {R0-R3, R12, PC}^

12. 用ARM 汇编语言编写代码,实现将ARM 处理器切换到用户模式,并关闭中断。

.equ User_Mode, 0x10 .equ Mode_Mask 0x1F .equ NOINT, 0xC0 MRS R0, CPSR BIC R0, R0, #Mode_Mask ORR R1, R0, #User_Mode | NOINT MSR CPSR_cxsf, R1

@读CPSR @修改

@进入用户模式

w w

w . k

h d

a w

. c

o m


相关文章

  • [ARM嵌入式系统结构与编程]习题答案 邱铁编著
  • <ARM 嵌入式系统结构与编程>邱铁 编著. 清华大学出版社. 年月第版 年月第二次印刷[1**********] <ARM 嵌入式系统结构与编程>第1~4章思考与练习 题答案 此答案仅供教师教学用 第1章 绪论 思 ...查看


  • 嵌入式技术基础与实践(第3版)课后习题1-8章答案
  • 试阅: hello ---------------------正文 第一章 1.嵌入式系统的基本含义是什么?为什么说单片机是典型的嵌入式系统? 答:即MCU 的含义是:在一块芯片上集成了中央处理单元(CPU ).存储器(RAM/ROM等). ...查看


  • 计算机三级嵌入式习题整理
  • 集成电路的工作速度主要取决于组成逻辑门电路的晶体管的尺寸.晶体管的尺寸越小,其极限工作频率越高,门电路的开关速度就越快. 在linux OS中,用"任务"替代"进程",而没有"进程" ...查看


  • 嵌入式培训总结
  • 篇一:嵌入式培训报告 学号: 创新生产实习报 学院 电信学院 专业 班级 学生 实习时间 年12月日至月 告 摘要 嵌入式系统是一种专用的计算机系统,作为装置或设备的一部分.通常,嵌入式系统是一个控制程序存储在rom 中的嵌入式处理器控制板 ...查看


  • 嵌入式软件人才的培养
  • [摘 要]随着信息产业和微电子技术的发展,嵌入式技术已经成为了最热门的技术之一,应用范围遍及我们日常生活的各个角落.于是全社会展开了学习嵌入式技术的热潮,嵌入式技术以不可阻挡的趋势走进了大学校园. [关键词]嵌入式:嵌入式人才:培养 [中图 ...查看


  • 让嵌入式"嵌入"生活
  • 让嵌入式"嵌入"你的生活 一.什么是嵌入式系统 嵌入式系统是以应用为中心,以计算机技术为基础,且软硬件可裁减,对功能.可靠性.成本.体积.功耗有严格要求的专用计算机系统. 二.生活中嵌入式 1)应用领域 2)嵌入式系统实 ...查看


  • 基于在系统可编程技术的PC运动控制卡研究
  • 集成电路应用 基于在系统可编程技术的!"运动控制卡研究 西安交通大学机械工程学院(I-##JB@ 摘 康健陶涛梅雪松吴序堂 要:介绍了在系统可编程(%&()器件及其优点,分析了(2多轴运动控制卡关键电路的工作 运行结果表明 ...查看


  • 7电子信息专业就业方向及薪水
  • 电子信息专业就业方向及薪水 如果从工程师和研究生的专业方向来看,电子信息专业的方向大概有 1)数字电子线路方向.从事单片机(8位的8051系列.32位的ARM系列等等).FPGA(CPLD).数字逻辑电路.微机接口(串口.并口.USB.PC ...查看


  • 通信专业学生,出来之后要干什么呢
  • 转的,看完觉得是好东西,转过来分享 如果从工程师和研究生的专业方向来看,电子信息专业的方向大概有 1)数字电子线路方向.从事单片机(8位的8051系列.32位的ARM系列等等).FPGA(CPLD).数字逻辑电路.微机接口(串口.并口.US ...查看


热门内容