您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > 嵌入式系统概论--课堂练习
一、指令运算1、利用若干指令,完成以下计算1)、求R4R3+R2R1,和放在R6R5中ADDSR5,R3,R1ADCSR6,R4,R22)、求R4R3-1,差放在R6R5中SUBSR5,R3,#1SBCR6,R4,#03)、求R4R3+1,和放在R6R5中ADDSR5,R3,#1ADCR6,R4,#04)、求R4R3-R2R1,差放在R6R5中SUBSR5,R3,R1SBCR6,R4,R22、写出以下ARM指令1).将R0+0x12地址处的数据读出,保存到R1中LDRR1,[R0,#0x12]2).将R1中数据保存到R0+0x12地址处STRR1,[R0,#0x12]3).将R0-0x12地址处的数据读出,保存到R1中LDRR1,[R0,-#0x12]4).将R1中的数据保存到R0-0x12地址处R1,[R0,-#0x12]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*3ADDR1,R2,R2,LSL#14、初始值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(0xFF2)、0、0xF0000000(0xF024)、200(0xC8)、0xF0000001(0x1F28)4.CMP指令的操作是什么?写一个程序,判断R1的值是否大于0x30,是则将R1减去0x30。CMP指令将寄存器Rn的值减去operand2的值,根据操作的结果更新CPSR中的相应条件标志位,以便后面的指令根据相应的条件标志来判断是否执行。CMPR1,#0x30SUBHIR1,R1,#0x305.调用子程序是用B还是用BL指令?请写出返回子程序的指令?BL指令用于子程序调用。MOVPC,LR6.请指出LDR伪指令的用法。指令格式与LDR加载指令的区别是什么?LDR伪指令用于加载32位的立即数或一个地址值到指定寄存器。第二个数为地址表达式。7.将R0最后4位数据保留,并影响标志位ANDSR0,R0,#0x0F8.将R0的1,3,5位置1ORRR0,R0,#0x2A9.将R0的1,3,5位置0BICR0,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;i8;i++){a[i]=b[7-i];}2、、用ARM编程实现如下功能:;for(i=0;i10;i++);{;x++;;};r0=x,r2=iARM程序如下:MOVR0,#0MOVR2,#0FOR_LPCMPR2,#10BHSFOR_ENDADDR0,R0,#1ADDR2,R2,#1BFOR_LPFOR_ENDNOP3、写一段ARM汇编程序:循环累加队列myarray中的所有元素,直到碰上零值元素,结果放在r4中。程序框架如下,补充代码完成上述功能。AREAtotal,CODE,READONLYENTRYstartMOVr4,#0ADRr0,myarray;在此补充代码loopLDRr1,[r0],#4ADDr4,r4,r1CMPr1,#0BNEloopstopBstopmyarrayDCD0x11DCD0x22……DCD0x0END4、、编写程序将R0和R1的内容相加的结果放入R2,将R0和R1的内容相减的结果放入R3,将R0*2和R1的内容相加的结果放入R4。AREAExamplel,CODE,READONLY;声明代码段ExamplelENTRY;标识程序入口CODE32;声明32位ARM指令STARTMOVR0,#0;设置参数MOVR1,#10LOOPBLADD_SUB;调用子程序ADD_SUBBLOOP;跳转到LOOPADD_SUBADDSR2,R0,R1SUBSR3,R0,R1MOVR0,R0,LSL#1ADDSR4,R0,R1MOVPC,LR;子程序返回END;文件结束5、用STMFD/LDMFD,MUL指令编写一个整数乘方的子程序,然后使用BL指令调用子程序计算Xn的值。原理:Xn=X*X*………*X,其中相乘的X个数为n个,先将X的值装入R0和R1中,使用R2作计数器,循环次数n-1次R0=R0*R1,运算结果保存在R0中:编程如下:;MAINROUTINEXEQU9nEQU8AREAMyPro,CODE,READONLYENTRYCODE32STARTLDRSP,=0x40003F00LDRR0,=XLDRR1,=nBLPOWHALTBHALT;POWSUBROUTINE;INPUTR0,R1;OUTPUTR0POWSTMFDSP!,{R1-R12,LR}MOVSR2,R1MOVEQR0,#1BEQPOW_ENDMOVR1,R0SUBR2,R2,#1POW_CONTIBLDO_MULSUBSR2,R2,#1BNEPOW_CONTIPOW_ENDLDMFDSP!,{R1-R12,LR};DO_MULSUBROUTINE;INPUTR0,R1;OUTPUTR0DO_MULMULR0,R1,R0MOVPC,LREND使能IRQ中断例程:ENABLE_IRQMRSR0,CPSRBICR0,R0,#0x80MSRCPSR_c,R0MOVPC,LR禁能IRQ中断例程:DISABLE_IRQMRSR0,CPSRORRR0,R0,#0x80MSRCPSR_c,R0MOVPC,LR
本文标题:嵌入式系统概论--课堂练习
链接地址:https://www.777doc.com/doc-2440454 .html