《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