习题 第3章嵌入式系统原理与实践沈建华清华大学出版社.docx

上传人:b****3 文档编号:5152149 上传时间:2023-05-08 格式:DOCX 页数:16 大小:21.25KB
下载 相关 举报
习题 第3章嵌入式系统原理与实践沈建华清华大学出版社.docx_第1页
第1页 / 共16页
习题 第3章嵌入式系统原理与实践沈建华清华大学出版社.docx_第2页
第2页 / 共16页
习题 第3章嵌入式系统原理与实践沈建华清华大学出版社.docx_第3页
第3页 / 共16页
习题 第3章嵌入式系统原理与实践沈建华清华大学出版社.docx_第4页
第4页 / 共16页
习题 第3章嵌入式系统原理与实践沈建华清华大学出版社.docx_第5页
第5页 / 共16页
习题 第3章嵌入式系统原理与实践沈建华清华大学出版社.docx_第6页
第6页 / 共16页
习题 第3章嵌入式系统原理与实践沈建华清华大学出版社.docx_第7页
第7页 / 共16页
习题 第3章嵌入式系统原理与实践沈建华清华大学出版社.docx_第8页
第8页 / 共16页
习题 第3章嵌入式系统原理与实践沈建华清华大学出版社.docx_第9页
第9页 / 共16页
习题 第3章嵌入式系统原理与实践沈建华清华大学出版社.docx_第10页
第10页 / 共16页
习题 第3章嵌入式系统原理与实践沈建华清华大学出版社.docx_第11页
第11页 / 共16页
习题 第3章嵌入式系统原理与实践沈建华清华大学出版社.docx_第12页
第12页 / 共16页
习题 第3章嵌入式系统原理与实践沈建华清华大学出版社.docx_第13页
第13页 / 共16页
习题 第3章嵌入式系统原理与实践沈建华清华大学出版社.docx_第14页
第14页 / 共16页
习题 第3章嵌入式系统原理与实践沈建华清华大学出版社.docx_第15页
第15页 / 共16页
习题 第3章嵌入式系统原理与实践沈建华清华大学出版社.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

习题 第3章嵌入式系统原理与实践沈建华清华大学出版社.docx

《习题 第3章嵌入式系统原理与实践沈建华清华大学出版社.docx》由会员分享,可在线阅读,更多相关《习题 第3章嵌入式系统原理与实践沈建华清华大学出版社.docx(16页珍藏版)》请在冰点文库上搜索。

习题 第3章嵌入式系统原理与实践沈建华清华大学出版社.docx

习题第3章嵌入式系统原理与实践沈建华清华大学出版社

第三章ARM指令系统

1.ARMv7架构使用的指令集有哪些特点?

在ARMv7版本的处理器内核中,不再使用ARM指令集,使用的是改进的Thumb指令集,称为Thumb-2指令集。

Thumb-2指令集是一种兼容16位和32位指令的指令集。

①在书写指令时不需要分析这条指令是32位指令还是16位指令,汇编器会自动按照最简化的原则汇编。

②编译环境提供了一种方法,由编程人员指定是哪一种代码格式。

如果在指令后面加后缀“.N”则指定是16位代码格式(Narrow),如果在指令后面加后缀“.W”则指定是32位代码格式(Wide)。

③代码密度以及速度都比现有的Thumb指令集更高。

2.ARM处理器支持几种基本寻址方式?

举例并分别说明。

①立即寻址,也叫作立即数寻址,这是一种特殊的寻址方式。

立即寻址方式的目的是将操作数紧跟在操作码后面,与操作码一起放在指令代码段中。

例如:

ADDR1,R0,#1;R0←R0+1即寄存器R0的内容加1,把结果放回到R1中

MOVR0,#0xFF00;将立即数0xFF00放入寄存器R0

②寄存器寻址,寄存器寻址指的是操作数的值在寄存器中,指令中的地址码字段给出的是寄存器编号,指令执行时直接取出寄存器值来操作。

例如:

ADDR0,R1,R2;将寄存器R1和R2的内容相加,结果存放在寄存器R0中

MOVR1,R2;将R2的值存入R1

③寄存器移位寻址,寄存器移位寻址的操作数是由寄存器做相应移位而得到的,移位的方式在指令中以助记符的形式给出,而移位的位数可用立即数或寄存器寻址方式表示。

例如:

MOVR0,R2,LSL#3;R2的值左移3位,结果放入R0,即R0=R2*8

④寄存器间接寻址,寄存器间接寻址指令中的地址码给出的是一个通用寄存器的编号,所需的操作数保存在存储器指定地址的存储单元中,即寄存器是操作数的地址指针。

例如:

LDRR1,[R2];将以R2的值作为地址单元对应的数据传送到R1中

⑤基址寻址,基址寻址方式就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到操作数的有效地址。

例如:

LDRR0,[R1,#4];R0←[R1+4],把基址R1的内容加上位移量4后所指;向的存储单元的内容送到寄存器R0中

⑥相对寻址,相对寻址和基址变址寻址方式类似,以程序计数器PC的当前值作为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。

以下程序段中的跳转指令采用了相对寻址:

BEQLOOP;条件跳转到LOOP标号处

LOOPMOVR6,#1

⑦多寄存器寻址,多寄存器寻址可以实现一条指令完成多个寄存器值的传送,允许一条指令传送16个寄存器的任何子集或所有寄存器。

LDMIAR0,{R1,R2,R3,R4};R1←[R0]R2←[R0+4]R3←[R0+8];R4←[R0+12]

⑧堆栈寻址,堆栈使用一个叫作堆栈指针的专用寄存器指示当前操作位置,堆栈指针总是指向栈顶,当堆栈由低地址向高地址生成时,称为递增堆栈;当堆栈由高地址向低地址生成时,称为递减堆栈。

STMFDSP!

{R1-R7,LR};R1~R7.LR入栈,满递减堆栈

LDMFDSP!

{R1-R7,LR};R1~R7.LR出栈,满递减堆栈

 

3.何谓ARM指令的条件码?

默认的条件码是什么?

举例说明ARM指令的条件码对指令执行的影响。

ARM指令的基本格式为{}{S},,{},其中{}表示一个可选的条件码,默认为1110,即无条件执行。

例如,跳转指令B可以加上后缀EQ(条件码0000的助记符为EQ)变为BEQ,表示“相等则跳转”,即当CPSR中的Z标志值位时发生跳转。

4.解释说明以下指令的含义。

①SUBR0,R1,#256

②MCRP3,3,R0,C4,C5,6

③MLASR0,R1,R2,R3

①R0=R1-256

②协处理器P3把C4和C5经过3操作(类型6)的结果赋给R0。

③R0=R1×R2+R3

5.试比较TST与ANDS,CMP与SUBS,MOV与MVN的区别。

①TST指令用于把一个寄存器的内容和另一个寄存器的内容或立即数进行按位的“与”运算,不保存运算结果但会根据运算结果更新CPSR中条件标志位的值;ANDS指令用于在两个操作数上进行逻辑与运算,结果放到目的寄存器中,更新CPSR中条件标志位的值;区别是是否保存相与的结果。

②CMP与SUBS的区别是是否保存相减的结果。

③MOV与MVN的区别是是否对第二个操作对象取反。

6.解释B指令、BL指令与BX指令的功能差别,并举例说明其使用方法。

B指令是分支指令,BL指令是带链接的分支指令,BX是带状态切换的分支指令。

其中,

B指令的跳转范围为±32M,比如“BWAITA”指跳转至标号WAITA处开始执行;

BL指令,实现程序跳转,并保持PC到链寄存器LR中,跳转范围为±32M。

比如“BLDELAY”实现跳转至标号DELAY处执行,并把PC-4存入LR;

BX指令,带状态切换的跳转,比如“BXR0”表示跳转至R0指定的地址开始执行,并查看R0[0]位的值。

如果是1,对CPSR的T位置位,解释目标程序为Thumb指令;如果是0,对CPSR的T位清零,解释目标程序为ARM指令。

7.简述ARM指令集中第2个操作数(operand2)的三种形式。

第2个操作数可为#immed_8r、寄存器Rm及任意移位的寄存器。

①#immed_8r常数表达式,该常数必须对应8位位图,即一个8位的常数通过循环右移偶数位得到的32位常数。

②循寄存器Rm,在寄存器方式下,操作数即为寄存器的数值。

③寄存器Rm移位,即将寄存器的移位结果作为操作数,Rm值保持不变。

8.解释“满堆栈”“空堆栈”“递增堆栈”和“递减堆栈”。

ARM指令系统中是如何支持的?

满堆栈:

堆栈指针指向最后压入堆栈的数据。

空堆栈:

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

递增堆栈:

堆栈由低地址向高地址生成。

递减堆栈:

堆栈由高地址向低地址生成。

在ARM指令中,数据的进栈和出栈通过Load/Store指令实现,指令STM向堆栈写数据项,指令LDM从堆栈读数据项。

9.指出下列指令是否正确,若不正确请说明原因。

①MOVSR1,101

②MVNR1,#0x10F

③STMDAR11,{R2-R8}!

④ADDR0!

R2,#4

⑤LDRR4,[R5]!

⑥MRSPC,CPSR

⑦LDMFDSR0!

{R5-R8,R2}

⑧ADDR3,[R3],R7

⑨LDRR11,[R15,R8]!

①MOVSR1,101不正确,立即寻址方式应该是#101

②MVNR1,#0x10F正确

③STMDAR11,{R2-R8}!

不正确,不能同时存储在R2和R8中

④ADDR0!

R2,#4正确

⑤LDRR4,[R5]!

不正确,LDR是存储到单个寄存器的加载指令,而该指令中两个存储器都进行存储,应该改为LDRR4,[R5]

⑥MRSPC,CPSR不正确,MRS是将CPSR传送到通用寄存器中,但这里的通用寄存器不包括R15,即PC

⑦LDMFDSR0!

{R5-R8,R2}正确

⑧ADDR3,[R3],R7不正确,ADD指令不能访问存储器

⑨LDRR11,[R15,R8]!

正确

10.试根据以下要求写出相应的汇编语言指令。

1)把BX寄存器和DX寄存器的内容相加,结果存入DX寄存器中。

2)用寄存器BX和位移量0B2H的寄存器相对寻址方式把存储器中的一个字和(CX)相加,并把结果送回存储器中。

3)用位移量为0524H的直接寻址方式把存储器中的一个字与数2A59H相加,并把结果送回存储单元中。

4)把数0B5H与(AL)相加,并把结果送回AL中。

①ADDDX,BX

②ADD0B2H[BX],CX

③ADDDS:

[0524H],WORDPTR2A59H

④ADDAL,0B5H

11.已知RAM内0x0300处连续存放某班60名学生成绩(百分制),试用汇编语言完成以下功能:

1)求出平均成绩,并存入0x400处。

AREAReset,DATA,READONLY

DCD0X12345678

DCDReset_Handler

AREACODE_SEGMENT,CODE,READONLY

Reset_Handlerproc

exportReset_Handler[weak]

;拷贝至SRAM

;MOVR0,#0X20000000;MSP432SRAM开始地址

Start

MOVR0,#0X0300

LDRR1,=ARRAY

MOVR5,#99;数组最后一个元素的索引

MOVR2,#0

COPY

CMPR2,R5

BGTCALCU

LDRR3,[R1,R2];R1加R2的地址处的数据读出,保存到R3

STRR3,[R0,R2];R3的数据保存到R0+R2地址,即指定内存地址

ADDR2,#4;按字长大小拷贝,即4个字节

BCOPY

CALCU

;floatavg=0;

VLDRS0,[PC,#0X50]

VMOVR6,S0

;intsum=0;

MOVSR5,#0X00

;inti=0;

MOVSR4,#0X00

NOP

BLOOP

;sum+=score[i];

BODY

ADDR0,SP,#0X04

LDRR0,[R0,R4,LSL#2]

ADDR5,R5,R0

ADDSR4,R4,#1

LOOP

CMPR4,#0X64

BLTBODY

MOVSR0,#0x64

SDIVR0,R5,R0

VMOVS0,R0

VCVT.F32.S32S0,S0

VMOVR6,S0

MOVR0,#0x400

STRR6,[R0]

ARRAYDCB1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100

ENDP

END

2)将成绩分成A(>89)、B(80~89)、C(70~79)、D(60~69)和E(0~59)5个等级,并计算每一等级内的学生个数,并将其一次存放到0x0410~0x0414处。

AREAReset,DATA,READONLY

DCD0X12345678

DCDReset_Handler

AREACODE_SEGMENT,CODE,READONLY

Reset_Handlerproc

exportReset_Handler[weak]

MOVR0,#0X0300

LDRR1,=ARRAY

MOVR5,#99;数组最后一个元素的索引

MOVR2,#0

COPY

CMPR2,R5

BGTBEGIN

LDRR3,[R1,R2];R1加R2的地址处的数据读出,保存到R3

STRR3,[R0,R2];R3的数据保存到R0+R2地址,即指定内存地址

ADDR2,#4;按字长大小拷贝,即4个字节

BCOPY

 

;intcount_0,count_1,count_2,count_3,count_4=0;

;inti=0;

BEGIN

MOVr9,#0x00

MOVSr8,#0x00

MOVSr7,#0x00

MOVSr6,#0x00

MOVSr5,#0x00

MOVSr4,#0x00

;for(i=0;i<5;i++){

NOP

BJUDGE

;if(score[i]>=90){

LOOP

ADDr0,sp,#0x08

LDRr0,[r0,r4,LSL#2]

CMPr0,#0x5A

BLTNEXT1

;count_0++;

ADDSr5,r5,#1

BNEXTTRIP

;}elseif(score[i]>=80&&score[i]<90){

NEXT1

ADDr0,sp,#0x08

LDRr0,[r0,r4,LSL#2]

CMPr0,#0x50

BLTNEXT2

ADDr0,sp,#0x08

LDRr0,[r0,r4,LSL#2]

CMPr0,#0x5A

BGENEXT2

;count_1++;

ADDSr6,r6,#1

BNEXTTRIP

;}elseif(score[i]>=70&&score[i]<80){

NEXT2

ADDr0,sp,#0x08

LDRr0,[r0,r4,LSL#2]

CMPr0,#0x46

BLTNEXT3

ADDr0,sp,#0x08

LDRr0,[r0,r4,LSL#2]

CMPr0,#0x50

BGENEXT3

;count_2++;

ADDSr7,r7,#1

BNEXTTRIP

;}elseif(score[i]>=60&&score[i]<70){

NEXT3

ADDr0,sp,#0x08

LDRr0,[r0,r4,LSL#2]

CMPr0,#0x3C

BLTNEXT4

ADDr0,sp,#0x08

LDRr0,[r0,r4,LSL#2]

CMPr0,#0x46

BGENEXT4

;count_3++;

ADDr8,r8,#0x01

BNEXTTRIP

;}elseif(score[i]>=0&&score[i]<60){

NEXT4

ADDr0,sp,#0x08

LDRr0,[r0,r4,LSL#2]

CMPr0,#0x00

BLTNEXTTRIP

ADDr0,sp,#0x08

LDRr0,[r0,r4,LSL#2]

CMPr0,#0x3C

BGENEXTTRIP

;count_4++;

ADDr9,r9,#0x01

NEXTTRIP

ADDSr4,r4,#1

JUDGE

CMPr4,#0x64

BLTLOOP

MOVr0,#0x0410

STRr5,[r0]

MOVr1,#0x0411

STRr6,[r1]

MOVr2,#0x0412

STRr7,[r2]

MOVr3,#0x0413

STRr8,[r3]

MOVr4,#0x0414

STRr9,[r4]

 

ARRAYDCB1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100

ENDP

END

12.已知ARM内有一块连续存放的数据,起始地址为0x0332,数据块大小为50。

试用汇编语言实现块内数据降序排列。

AREAReset,DATA,READONLY

DCD0x12345678

DCDReset_Handler

AREACODE_SEGMET,CODE,READONLY

Reset_Handlerproc

exportReset_Handler[weak]

;拷贝至SRAM

;MOVR0,#0x20000000;MSP432SRAM开始地址

MOVR0,#0x0332

LDRR1,=ARRAY

MOVR5,#49;数组最后一个元素的索引,数组长度-1

MOVR2,#0

COPY

CMPR2,R5

BGTSORT

LDRR3,[R1,R2];R1加R2的地址处的数据读出,保存到R1

STRR3,[R0,R2];R3的数据保存到R0+R2地址,即指定内存地址

ADDR2,#4;按字长大小拷贝,即4个字节

BCOPY

;冒泡排序

SORT

MOVR2,#0

LOOP

MOVR1,R2

CMPR1,R5

BEQEXIT;完成一轮排序

ADDR2,R1,#1

LDRBR3,[R0,R1];单字节从内存载入寄存器

LDRBR4,[R0,R2]

CMPR3,R4

BGELOOP;R3>=R4跳转至LOOP,否则交换R3、R4对应的内存

STRBR4,[R0,R1]

STRBR3,[R0,R2]

BLOOP

EXIT

SUBSR5,#1;R5>0时表示未完成所有排序,跳转至SORT;

BGTSORT

NOP

ENDP

ARRAYDCB1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50

END

13.已知RAM内0x0600处存放有一个16位无符号数,试用汇编语言编程实现将其二进制数转换成十进制数,并将该十进制数转换成相应的ASCII码。

AREAReset,DATA,READONLY

DCD0x12345678

DCDReset_Handler

AREACODE_SEGMET,CODE,READONLY

Reset_Handlerproc

exportReset_Handler[weak]

;拷贝至SRAM

;MOVR0,#0x20000000;MSP432SRAM开始地址

MOVR0,#0x0600

LDRR1,=NUM

LDRHR2,[R1];按半字将NUM载入R2

STRR2,[R0];将R2放入指定内存位置

;16位无符号数最大为65535,转换为ASCII码为“65535”,需要5个字节地址空间

MOVR7,R0

ADDR7,#0x10;以R7值(R0+0x10)开始的内存空间用于存放结果

;因需要对NUM做除10取余运算,取余运算已有现成函数库(可不使用硬件除法器)且性能较好

;为方便大家理解此处改用UDIV指令实现除10,求余则使用MLS指令,n-(n/10)*10或n-((n/10)<<3+(n/10)<<1)

;R2存放商,R3存放余数

MOVR5,#10;R5存放除数10

LOOP

CMPR2,#0;判断商是否为零

BEQEXIT

UDIVR4,R2,R5;R4=R2/R5=R2/10求商

MLSR3,R5,R4,R2;R3=R2-(10*R4)求余

ADDR3,#0x30;转换为ASCII数值

STRBR3,[R7];存入指定内存地址

ADDR7,#1

MOVR2,R4

BLOOP

EXIT

NOP

ENDP

NUMDCW65535

END

14.编写一个程序,把从键盘输入的一个小写字母用大写字母显示出来。

AREAReset,DATA,READONLY

DCD0X12345678

DCDReset_Handler

AREACODE_SEGMENT,CODE,READONLY

Reset_Handlerproc

exportReset_Handler[weak]

MOVR1,SP

LDRBR0,[SP,#0X00]

SUBR1,R0,#0X20

ENDP

END

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

当前位置:首页 > 农林牧渔 > 林学

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

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