ARM复习课后题答案完整版知识讲解Word下载.docx

上传人:b****3 文档编号:7180978 上传时间:2023-05-08 格式:DOCX 页数:18 大小:31.17KB
下载 相关 举报
ARM复习课后题答案完整版知识讲解Word下载.docx_第1页
第1页 / 共18页
ARM复习课后题答案完整版知识讲解Word下载.docx_第2页
第2页 / 共18页
ARM复习课后题答案完整版知识讲解Word下载.docx_第3页
第3页 / 共18页
ARM复习课后题答案完整版知识讲解Word下载.docx_第4页
第4页 / 共18页
ARM复习课后题答案完整版知识讲解Word下载.docx_第5页
第5页 / 共18页
ARM复习课后题答案完整版知识讲解Word下载.docx_第6页
第6页 / 共18页
ARM复习课后题答案完整版知识讲解Word下载.docx_第7页
第7页 / 共18页
ARM复习课后题答案完整版知识讲解Word下载.docx_第8页
第8页 / 共18页
ARM复习课后题答案完整版知识讲解Word下载.docx_第9页
第9页 / 共18页
ARM复习课后题答案完整版知识讲解Word下载.docx_第10页
第10页 / 共18页
ARM复习课后题答案完整版知识讲解Word下载.docx_第11页
第11页 / 共18页
ARM复习课后题答案完整版知识讲解Word下载.docx_第12页
第12页 / 共18页
ARM复习课后题答案完整版知识讲解Word下载.docx_第13页
第13页 / 共18页
ARM复习课后题答案完整版知识讲解Word下载.docx_第14页
第14页 / 共18页
ARM复习课后题答案完整版知识讲解Word下载.docx_第15页
第15页 / 共18页
ARM复习课后题答案完整版知识讲解Word下载.docx_第16页
第16页 / 共18页
ARM复习课后题答案完整版知识讲解Word下载.docx_第17页
第17页 / 共18页
ARM复习课后题答案完整版知识讲解Word下载.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

ARM复习课后题答案完整版知识讲解Word下载.docx

《ARM复习课后题答案完整版知识讲解Word下载.docx》由会员分享,可在线阅读,更多相关《ARM复习课后题答案完整版知识讲解Word下载.docx(18页珍藏版)》请在冰点文库上搜索。

ARM复习课后题答案完整版知识讲解Word下载.docx

式。

在这模式下按中断的处理器方式又分为向量中断和非向量中断两种。

通常的中

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

SVC模式:

称之为管理模式,它是一种操作系统保护模式。

当复位或软中断指

令执行时处理器将进入这种模式。

中止模式:

当存取异常时将会进入这种模式,用来处理存储器故障、实现虚拟

存储或存储保护。

未定义指令异常模式:

当执行未定义指令时会进入这种模式,主要是用来处理

未定义的指令陷阱,支持硬件协处理器的软件仿真,因为未定义指令多发生在对协

处理器的操作上。

系统模式:

使用和User模式相同寄存器组的特权模式,用来运行特权级的操作

系统任务。

在这7种工作模式中,除了用户模式以外,其他6种处理器模式可以称为特权

模式,在这些模式下,程序可以访问所有的系统资源,也可以任意地进行处理

器模式的切换。

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

称为异常模式

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

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

PSR的具体格式为

V—溢出标志位

对于加/减法运算指令,当操作数和运算结果为二进制补码表示的带符号数时,

V=1表示符号位溢出,其他的指令通常不影响V位。

C—进位或借位标志位

对于加法指令(包括比较指令CMN),结果产生进位,则C=1,表示无符号

数运算发生上溢出,其他情况下C=0;

在减法指令中(包括比较指令CMP),结果产生借位,则C=0,表示无符号数

运算发生下溢出,其他情况下C=1;

对于包含移位操作的非加/减法运算指令,C中包含最后一次溢出位的数值;

对于其他非加/减法运算指令,C位的值通常不受影响。

Z—结果为0标志位

Z=1表示运算结果是0,Z=0表示运算结果不是零;

对于CMP指令,Z=1表示进行比较的两个数大小相等。

N—符号标志位

本位设置成当前指令运算结果的bit[31]的值。

当两个补码表示有符号整数运算

时,N=1表示运算的结果为负数,N=0表示结果为正数或零。

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

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

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

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

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

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

值;

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

ARM在异常返回时

(1)从SPSR_<

mode>

恢复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的字单元,其中字节单元由高位到低位字节地

址顺序为A,A+1,A+2,A+3;

对于地址为A的半字单元,其中字节单元由高位到低

位字节地址顺序为A,A+1。

第3章ARM指令集寻址方式

3.在ARM指令中,什么是合法的立即数?

判断下面各立即数是否合法,如果合

法则写出在指令中的编码格式(也就是8位常数和4位的移位数)。

0x54300x1080x3040x501

0xFB100000x3340000x3FC0000x1FE0000

0x55800000x7F8000x39C0000x1FE80000

计算步骤:

(1)十六进制立即数两端0去掉

(2)展成二进制

(3)连续偶数个0去掉,数字中间0不去掉

(4)剩下数字位数小于等于8可以,反之,不可以。

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

ARM数据处理指令寻址方式有5种

1)第二操作数为立即数

2)第二操作数为寄存器

3)第二操作数为寄存器移位方式,且移位的位数为一个5位的立即数

4)第二操作数为寄存器移位方式,且移位数值放在寄存器中

5)第二操作数为寄存器进行RRX移位得到

如果程序计数器PC作为目标寄存器,会发生程序跳转。

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

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

字、无符号字节寻址:

1)Addressing_mode中的偏移量为立即数

2)Addressing_mode中的偏移量为寄存器的值

3)Addressing_mode中的偏移量通过寄存器移位得到

半字、有符号字节寻址:

从以上分析看出:

差别就在于后者没有第三项寻址方式。

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

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

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

变化方式(addr_mode)有以下4种类型:

后增IA(IncrementAfter):

每次数据传送后地址加4;

先增IB(IncrementBefore):

每次数据传送前地址加4;

后减DA(DecrementAfter):

每次数据传送后地址减4;

先减DB(DecrementBefore):

每次数据传送前地址减4。

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

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

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

满递增堆栈FA(EmptyAscending):

堆栈指针指向最后压入的数据,且由低地址

向高地址生成。

满递减堆栈FD(FullDescending):

堆栈指针指向最后压入的数据,且由高地址

向低地址生成。

空递增堆栈EA(FullAscending):

堆栈指针指向下一个将要放入数据的空位置,

且由低地址向高地址生成。

空递减堆栈ED(EmptyDescending):

堆栈指针指向下一个将要放入数据的空位

置,且由高地址向低地址生成。

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

第4章ARM指令集系统

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

CMPR0,#0

MOVEQR1,#0

MOVGTR1,#1

分析:

当R0等于0时,MOVEQ执行,则R1等于0;

当R0等于正数时,MOVGT执行,则R1等于1;

此功能码段可以判别R0中的值为正数还是0。

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

例如,MVNR0,#0

或者:

MOVR0,#0

SUBR0,R0,#1

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

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

LDRR2,[R3,#-4]!

LDRR0,[R0],R2

LDRR1,[R3,R2,LSL#2]!

LDRSBR0,[R2,#-2]!

STRBR1,[R2,#0xA0]

LDMIAR0,{R1,R2,R8}

STMDBR0!

,{R1-R5,R10,R11}

解答:

LDRR2,[R3,#-4]!

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

LDRR0,[R0],R2

将存储器地址为R0的字数据读入R0,并将地址R0+R2写入R0

LDRR1,[R3,R2,LSL#2]!

将存储器地址为R3+R2*4的字数据读入R1,并将地址R3+R2*4写入R3

LDRSBR0,[R2,#-2]!

将存储器地址为R2-2的字节数据读入R0的低8位,将R0的高24位用符号

位扩展,并将地址R2-2写入R2

STRBR1,[R2,#0xA0]

将R0的低8位存入存储器地址为R2+0xA0字节中

LDMIAR0,{R1,R2,R8}

将内存单元R0所指向的地址单元以字为单位递减方式读取到R1,R2,R8中,

低地址编号的字数据内存单元对应低编号寄存器

STMDBR0!

{R1-R5,R10,R11}

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

的地址单元

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

ARM指令支持原子操作,主要是用来对信号量的操作,因为信号量操作的要求

是作原子操作,即在一条指令中完成信号量的读取和修改操作。

SWP数据交换指令

就能完成此功能,能在一条指令中实现存储器和寄存器之间交换数据。

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

在进入IRQ中断处理子程序时,首先计算返回的地址,并保存相关的寄存器

SUBR14,R14,#4

STMFDR13!

{R0-R3,R12,LR}

如果IRQ中断处理程序返回到被中断的进程则执行下面的指令。

该指令从数据栈中恢复R0-R3及R12的值,将返回地址传送到PC中,并将SPSR_irq值复制到CPSR中

LDMFDR13!

{R0-R3,R12,PC}^

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

.equUser_Mode,0x10

.equMode_Mask0x1F

.equNOINT,0xC0

MRSR0,CPSR@读CPSR

BICR0,R0,#Mode_Mask

ORRR1,R0,#User_Mode|NOINT@修改

MSRCPSR_cxsf,R1@进入用户模式

第6章ARM汇编伪指令与伪操作

1.在ARM汇编语言程序设计中,伪操作与伪指令的区别是什么?

伪指令是ARM处理器支持的汇编语言程序里的特殊助记符,它不在处理器运行期间由机器执行,只是在汇编时被合适的机器指令代替成ARM或Thumb指令,从而实现真正的指令操作。

伪操作是ARM汇编语言程序里的一些特殊的指令助记符,其作用主要是为完成汇编程序做各种准备工作,对源程序进行汇编程序处理,而不是在计算机运行期间由处理器执行。

也就是说,这些伪操作只是在汇编过程中起作用,一旦汇编结束,伪操作也就随之消失。

2.分析ARM汇编语言伪指令LDR、ADRL、ADR的汇编结果,说明它们之间的区别。

LDR是大范围地址读取伪指令。

LDR将一个32位的常数或者一个地址值读取到寄存器中,可以看作是加载寄存器的内容。

ADRL是中等范围地址读取伪指令。

它将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。

ADR是小范围地址读取伪指令,它将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中。

从以上分析可以看出:

LDR不依赖于PC值,加载的数据是绝对值。

ADRL和ADR依赖于PC值,加载的数据是基于PC相对偏移值

第7章汇编语言程序设计

4.在GNU环境下用ARM汇编语言编写程序初始化各ARM处理器各模式下的堆栈指针SP_mode

(R13),各模式的堆栈地址如下:

.equ_ISR_STARTADDRESS,0xcFFF000

.equUserStack,_ISR_STARTADDRESS

.equSVCStack,_ISR_STARTADDRESS+64

.equUndefStack,_ISR_STARTADDRESS+64*2

.equAbortStack,_ISR_STARTADDRESS+64*3

.equIRQStack,_ISR_STARTADDRESS+64*4

.equFIQStack,_ISR_STARTADDRESS+64*5

//--------------------------示例程序----------------------------------

代码为平常自己写的,上机调试成功!

与题目有点不一样,变量名和数值得改一改

//--------------------------------------------------------------------

.equISR_STARTADDRESS,0x40008000

.equsvc_stack_top,ISR_STARTADDRESS/*0x40008000*/

.equuser_stack_top,ISR_STARTADDRESS-512/*0x40007E00*/

.equundefstack_top,ISR_STARTADDRESS-512*2/*0x40007C00*/

.equabortstack_top,ISR_STARTADDRESS-512*3/*0x40007A00*/

.equisrstack_top,ISR_STARTADDRESS-512*4/*0x40007800*/

.equfiqstack_top,ISR_STARTADDRESS-512*5/*0x40007600*/

.equuser_mode,0x10

.equfiq_mode,0x11

.equirq_mode,0x12

.equsvc_mode,0x13

.equabt_mode,0x17

.equudf_mode,0x1c

.equsys_mode,0x1f

.global_start

.text

_start:

breset_handler

bundifned_handler

bsvc_handler

bprefetch_handler

babort_handler

b.

birq_handler

bfiq_handler

reset_handler:

ldrsp,=svc_stack_top/*svc_stack*/

mrsr0,cpsr

bicr0,r0,#0x1f

orrr0,r0,#udf_mode

msrcpsr_c,r0

ldrsp,=undefstack_top/*undefstack*/

orrr0,r0,#abt_mode

ldrsp,=abortstack_top/*abortstack*/

orrr0,r0,#irq_mode

ldrsp,=isrstack_top/*isrstack*/

orrr0,r0,#fiq_mode

ldrsp,=fiqstack_top/*fiqstack*/

orrr0,r0,#user_mode

ldrsp,=user_stack_top/*user_stack*/

stop:

b.

undifned_handler:

svc_handler:

stmfdsp!

{r0-r12,lr}

ldrr0,[lr,#-4]

bicr0,r0,#0xff000000

ldmfdsp!

{r0-r12,pc}^

prefetch_handler:

abort_handler:

irq_handler:

fiq_handler:

.end

//另外有第5题和第7题,没时间写,可是老师也划题了。

第8章嵌入式C编程规范

3.volatile限制符在程序中起到什么作用,请举例说明。

volatile限制符起到抑制编译器优化的作用。

例如:

中断服务程序中修改的供其他程序检测的变量的问题。

Staticcharflg=0;

main(void)

{

While

(1)

{

if(flg)

…程序代码A

}

else

…程序代码B

}

//中断服务程序

VoidISR_INT(void)

flg=1;

在这个程序中,由于在程序执行的大部分时间内,flg的值并没有变化,编译器会优化程序,flg=0。

优化后的程序为:

while

(1)

解决问题的方法:

将声明语句staticcharflg=0;

改为volatilestaticcharflg=0

3.请分析下列程序代码的执行结果

#include<

stdio.h>

main()

{

intvalue=0xff1;

int*p1,**p2,***p3,****p4;

p1=&

value;

p2=&

p1;

p3=&

p2;

p4=&

p3;

printf(“****p4=%x\n”,****p4);

程序执行结果:

*****p4=oxff1;

5.分析宏定义#definePOWER(x)x*x是否合理,举例说明。

如果不合理,应如何更改?

不合理。

x=i+j;

POWER(x)=i+j*i+j;

而不是(i+j)*(i+j)

更改:

#definePOWER(x)((x)*(x))

7.何为可重入函数?

如果使程序具有可重入性,在程序设计中应注意哪些问题?

如果某个函数可以被多个任务并发使用,而不会造成数据错误,我们就说这个函数具有可重入性,相应的这个函数就可以成为可重入函数。

可重入函数可以使用局部变量,也可以使用全局变量。

如果使用全局变量,则应通过关中断、信号量(P、V操作)等手段对其加以保护,若不加以保护,则此函数就不具有可重入性,即当多个进程调用此函数时,很有可能使得此全局变量变为不可知状态。

9.ATPCS与AAPCS的全称是什么,它们有什么差别?

掌握子程序调用过程中寄存器的使用规则、数据栈的使用规则及参数的传递规则,在具体的函数中能够熟练应用。

过程调用标准ATPCS(ARM-ThumbProduceCallStandard)规定了子程序间相互调用的基本规则,ATPCS规定子程序调用过程中寄存器的使用规则、数据栈的使用规则及参数的传递规则。

这些规则为嵌入式C语言程序和汇编程序之间相互调用提供了依据。

2007年,ARM公司推出了新的过程调用标准AAPCS(ARMArchitectureProduceCallStandard),它只是改进了原有的ATPCS的二进制代码的兼容性。

目前,这两个标准都在被使用。

第9章S3C2410硬件结构与关键技术分析

第10章S3C2410通信与LCD接口技术

//S3C2410的启动初始化程序这个一定要会的!

《《《《《《------嵌入式linux标准开发教程-------》》》》》

//这应该是考点吧!

第1章linux快速入门

1.3linux文件及文件系统

文件类型、文件属性、文件系统、linux目录结构

第2章linux基础指令

//基本指令太多了,考哪些不好说啊,会的越多越好吧!

2.2linux启动过程详解

第3章linux下C编程基础

3.3GCC编译器的使用

3.5Make工程管理器

//答案有的来自pdf有的为自己所写,仅供参考.

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2