嵌入式系统概论课堂练习Word文件下载.docx
《嵌入式系统概论课堂练习Word文件下载.docx》由会员分享,可在线阅读,更多相关《嵌入式系统概论课堂练习Word文件下载.docx(10页珍藏版)》请在冰点文库上搜索。
5).将R0+R2地址处的数据读出,保存到R1中
LDRR1,[R0,R2]
6).将R1中数据保存到R0+R2地址处
STRR1,[R0,R2]
7).将R0-R2地址处的数据读出,保存到R1中
LDRR1,[R0,-R2]
8).将R1中的数据保存到R0-R2地址处
STRR1,[R0,-R2]
3、写一条ARM指令,完成操作r1=r2*3
ADDR1,R2,R2,LSL#1
4、初始值R1=23H,R2=0FH执行指令BICR0,R1,R2,LSL#1后,寄存器R0,R1的值分别是多少?
R0=21H,R1=23H
二、指令操作
1.ARM7TDMI(-S)有几种寻址方式?
LDRR1,[R0,#0x08]属于哪种寻址方式?
1.寄存器寻址
2.立即寻址;
3.寄存器移位寻址;
4.寄存器间接寻址;
5.基址加偏址寻址;
6.多寄存器寻址;
7.堆栈寻址;
8.块复制寻址;
9.相对寻址;
LDRR1,[R0,#0x08]属于基址加偏址寻址。
2.ARM指令的条件码有多少个?
默认条件码是什么?
16条,默认条件码是AL。
3.ARM指令中第二个操作数有哪几种形式?
举例5个8位图立即数。
(1)立即数;
(2)寄存器;
(3)寄存器及移位常数;
0x3FC(0xFF<
<
2)、0、0xF0000000(0xF0<
24)、200(0xC8)、0xF0000001(0x1F<
28)
4.CMP指令的操作是什么?
写一个程序,判断R1的值是否大于0x30,是则将R1减去0x30。
CMP指令将寄存器Rn的值减去operand2的值,
根据操作的结果更新CPSR中的相应条件标志位,
以便后面的指令根据相应的条件标志来判断是否执行。
CMPR1,#0x30
SUBHIR1,R1,#0x30
5.调用子程序是用B还是用BL指令?
请写出返回子程序的指令?
BL指令用于子程序调用。
MOVPC,LR
6.请指出LDR伪指令的用法。
指令格式与LDR加载指令的区别是什么?
LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。
第二个数为地址表达式。
7.将R0最后4位数据保留,并影响标志位
ANDSR0,R0,#0x0F
8.将R0的1,3,5位置1
ORRR0,R0,#0x2A
9.将R0的1,3,5位置0
BICR0,R0,#0x2A
三、解释应用
1、说明指令STMIAr12!
{r0-r11}的操作功能。
答:
将R0至R11共12个寄存器中的32位数据,存储到R12地址指针为起始地址的内存中,地址的操作方式是先操作、后增加,并更新地址。
2、简单说明ARM7TDMI的含义。
64位乘法指令(带M后缀的)、
支持片上调试(带D后缀的)、
高密度16位的Thumb指令机扩展(带T后缀的)
EmbededICE观察点硬件(带I后缀的)
3、什么是小端和大端存储器组织?
1)小端存储器组织是较高的有效字节存放在较高的存储器地址,较低的有效字节存放在较低的存储器地址。
2)大端存储器组织是较高的有效字节存放在较低的存储器地址,较低的有效字节存放在较高的存储器地址。
4、分别列举ARM的处理器模式和状态
状态:
ARM状态32位,这种状态下执行的是字方式的ARM指令
Thumb状态16位,这种状态下执行半字方式的Thumb指令
Thumb-2状态可以以执行16位或32位混合的Thumb-2指令
Thumb-2EE状态V7以后新定义的可实时编译的指令集执行环境
模式:
用户模式、快中断模式、中断模式、管理模式、中止模式、未定义模式和系统模式。
5、简单叙述CPSR寄存器和SPSR寄存器的作用,以及CPSR各状态位的作用是什么。
1)CPSR包含条件码标志、中断禁止位、当前处理器模式以及其它状态和控制信息。
所有处理器模式下都可以访问当前的程序状态寄存器CPSR。
2)在每种异常模式下都有一个对应的物理寄存器——程序状态保存寄存器SPSR。
当异常出现时,SPSR用于保存CPSR的状态,以便异常返回后恢复异常发生时的工作状态。
6、请指出MOV指令与LDR加载指令的区别及用途。
1)、MOV将8位图(pattern)立即数或寄存器(operand2)传送到目标寄存器(Rd),可用于移位运算等操作。
2)、LDR读取指定地址上的存储器单元内容,执行条件AL.
7、、采用多寄存器寻址方式,可以用一条指令完成传送最多16个通用寄存器的值。
请解释以下指令的含义:
LDMIAR0,{R1,R2,R3,R4};
该指令的后缀IA表示在每次执行完加载/存储操作后,R0按字长度增加,因此,指令可将R0所指的连续存储单元的值传送到R1~R4。
指令执行过程如下:
R1←[R0]
R2←[R0+4]
R3←[R0+8]
R4←[R0+12]
四、程序设计题
1.把下面的C代码转换成汇编代码。
数组a和b分别存放在以0x4000和0x5000为起始地址的存储区内,类型为long(即32位)。
把编写的汇编语言进行编译连接,并进行调试。
for(i=0;
i<
8;
i++)
{
a[i]=b[7-i];
}
2、、用ARM编程实现如下功能:
;
for(i=0;
i<
10;
i++)
;
{
x++;
}
r0=x,r2=i
ARM程序如下:
MOVR0,#0
MOVR2,#0
FOR_LP
CMPR2,#10
BHSFOR_END
ADDR0,R0,#1
ADDR2,R2,#1
BFOR_LP
FOR_END
NOP
3、写一段ARM汇编程序:
循环累加队列myarray中的所有元素,直到碰上零值元素,结果放在r4中。
程序框架如下,补充代码完成上述功能。
AREAtotal,CODE,READONLY
ENTRY
start
MOVr4,#0
ADRr0,myarray
;
在此补充代码
loop
LDRr1,[r0],#4
ADDr4,r4,r1
CMPr1,#0
BNEloop
stop
Bstop
myarray
DCD0x11
DCD0x22
……
DCD0x0
END
4、、编写程序将R0和R1的内容相加的结果放入R2,将R0和R1的内容相减的结果放入R3,将R0*2和R1的内容相加的结果放入R4。
AREAExamplel,CODE,READONLY;
声明代码段Examplel
ENTRY;
标识程序入口
CODE32;
声明32位ARM指令
STARTMOVR0,#0;
设置参数
MOVR1,#10
LOOPBLADD_SUB;
调用子程序ADD_SUB
BLOOP;
跳转到LOOP
ADD_SUB
ADDSR2,R0,R1
SUBSR3,R0,R1
MOVR0,R0,LSL#1
ADDSR4,R0,R1
MOVPC,LR;
子程序返回
END;
文件结束
5、用STMFD/LDMFD,MUL指令编写一个整数乘方的子程序,然后使用BL指令调用子程序计算Xn的值。
原理:
Xn=X*X*………*X,其中相乘的X个数为n个,先将X的值装入R0和R1中,使用R2作计数器,循环次数n-1次R0=R0*R1,运算结果保存在R0中:
编程如下:
MAINROUTINE
XEQU9
nEQU8
AREAMyPro,CODE,READONLY
ENTRY
CODE32
START
LDRSP,=0x40003F00
LDRR0,=X
LDRR1,=n
BLPOW
HALTBHALT
POWSUBROUTINE
INPUTR0,R1
OUTPUTR0
POW
STMFDSP!
{R1-R12,LR}
MOVSR2,R1
MOVEQR0,#1
BEQPOW_END
MOVR1,R0
SUBR2,R2,#1
POW_CONTI
BLDO_MUL
SUBSR2,R2,#1
BNEPOW_CONTI
POW_END
LDMFDSP!
{R1-R12,LR}
DO_MULSUBROUTINE
DO_MUL
MULR0,R1,R0
MOVPC,LR
END
使能IRQ中断例程:
ENABLE_IRQ
MRSR0,CPSR
BICR0,R0,#0x80
MSRCPSR_c,R0
MOVPC,LR
禁能IRQ中断例程:
DISABLE_IRQ
ORRR0,R0,#0x80