习题 第3章嵌入式系统原理与实践沈建华清华大学出版社.docx
- 文档编号:11147779
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:16
- 大小:21.25KB
习题 第3章嵌入式系统原理与实践沈建华清华大学出版社.docx
《习题 第3章嵌入式系统原理与实践沈建华清华大学出版社.docx》由会员分享,可在线阅读,更多相关《习题 第3章嵌入式系统原理与实践沈建华清华大学出版社.docx(16页珍藏版)》请在冰豆网上搜索。
习题第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指令的基本格式为
例如,跳转指令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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 习题 第3章嵌入式系统原理与实践沈建华清华大学出版社 嵌入式 系统 原理 实践 沈建华 清华大学出版社