1、嵌入式实验报告 3.1 实验一 ARM汇编指令实验1-简单数据搬移实验1.例题源程序:部分注释:AREA用于声明一个只读或读写的代码或数据段,ENTRY声明程序入口,CODE32用于申明以下代码为32位ARM指令,END程序结束。STR R0,SP ;将R0中的值放到SP中去LDR R1,SP ;将SP中的值赋给R1STR R0,SP,#4 ;先执行SP+4,再将寄存器R0内容复制到SP指向的存储器ADD R0,R0,R1 ;将R0+R1的值赋给R0结果截图:结果分析: x和y的值分别为45,64,程序实现过程是将x放进R1,y放进R0,再将x+y放进R0,因此R0中结果为109,即为6D。R
2、1中结果为45,即为2D。2.练习题设计思路: 利用R0做基地址,将R1,R2分别存入第一个单元的内容,利用R3做循环计数器,利用R4遍历读取第2至最后一个数据,如果R1的数据小于新读入的R4数据则将R4的内容存入R1,如果R2的内容大于R4的内容则将R4的内容存入R2。遍历完成之后,R1将存放最大数据,R2将存放最小数据。源程序: AREA Init,CODE,READONLY ENTRY CODE32 start MOV SP,#0X400 ;给指针赋初值 LDR R0,=DataBuf ;把数据定义表格中的值赋给R0 LDR R1,R0,#4 ;取数 MOV R2,R1 ;R1赋给R2
3、MOV R3,#8 ;R3做循环计数器,赋值为8compare SUB R3,R3,#1 ;实现R3自减 CMP R3,#0 ;比较R3和0,确定循环是否结束 BEQ over ;若R3等于0,结束循环 LDR R4,R0,#4 CMP R4,R1 ;比较R4和R1,找大值 BLT small1 ;小于跳转 MOV R1,R4small1 CMP R4,R2 ;比较R4和R2,找小值 BLT small2 ;小于跳转 BGT compare ;大于跳转small2 MOV R2,R4 B compareover B . AREA Datapool,DATA,READWRITE DataBuf
4、DCD 11,-2,35,47,96,63,128,-23 ;数据的定义采用伪指令DCD实现 END结果截图:结果分析: 遍历完成后,数据的最大值和最小值都已经找出,其中最大值存放在R1中,最小值存放在R2中。由结果可知,R1中为0x00000080,即为128,R2中为0xFFFFFFE9,即为-23。 实验3.2 ARM汇编指令实验2-字符串拷贝实验1、例题源程序:AREA Init,CODE,READONLY ENTRY CODE32 START MOV SP,#0x400 ;堆栈地址 LDR R0,=Src ;将初始字符串地址给R0 LDR R1,=Dst ;将目的字符串地址给R1 M
5、OV R3,#0 ;给R3赋值0 strcopy LDRB R2,R0,#1 ;把R0给R2后加一 CMP R2,#0 ;比较R2和0,检测字符串是否结束 BEQ endcopy ;等于跳转到结束 STRB R2,R1,#1 ;把R2给R1后R1+1 ADD R3,R3,#1 ;R3自加 B strcopy ;循环 endcopy LDR R0,=ByteNum ;把字符数的地址给R0 STR R3,R0 ;把R3的值放到R0中 B . AREA Datapool,DATA,READWRITESrc DCB string0 ;初始字符串存储空间Dst DCB 0,0,0,0,0,0,0,0,0
6、,0,0,0,0,0,0,0,0,0,0,0 ;目的字符串存储空间ByteNum DCD 0 END实验截图:结果分析: 由程序可知,初始状态是R0存放起始字符串,R1存放目的字符串,R3赋初值0,拷贝字符串过程中,R3作为计数变量,每次自增一,拷贝借用R2做中转寄存器,每次复制到R2一个字符都要检查是否为0 ,若为0则字符串已经拷贝完毕,跳转到endcopy,若不为0则继续循环拷贝,直到结束。最后将技术变量的值存放到到R0中。实验结果截图可知,R0中为字符串长度,R1为目的字符串。2、练习题设计思路: R4R11起始值为18,每次加操作后把R4R11的内容放入SP栈中,SP初始设置为0x80
7、0,最后把R4R11清空赋值为0。多字的加载与存储使用多寄存器寻址,使用的指令为LDM和STM。源程序: AREA Init,CODE,READONLY ENTRY CODE32 start MOV SP,#0X800 LDR R0,=src ;把src的地址赋给R0 LDR R2,=str ;把str的地址赋给R2 MOV R1,#8 LDMIA R2!,R4-R11 ;将以R2起始地址的值存入R4-R11 MOV R4,#1 MOV R5,#2 MOV R6,#3 MOV R7,#4 MOV R8,#5 MOV R9,#6 MOV R10,#7 MOV R11,#8 ;给寄存器赋初值 lo
8、op ADD R4,R4,#1 ADD R5,R5,#1 ADD R6,R6,#1 ADD R7,R7,#1 ADD R8,R8,#1 ADD R9,R9,#1 ADD R10,R10,#1 ADD R11,R11,#1 ;赋值的循环部分,给每一个寄存器赋原值加一 STMIA SP!,R4-R11 ; SUBS R1,R1,#1 ;循环变量R1自减1 BNE loop ;不为0返回循环 LDMIA R0!,R4-R11 ;将以R0起始地址的值存入R4R11HALT B HALT ;停留,循环src DCD 0,0,0,0,0,0,0,0 END实验截图:结果分析: 进行步的运行,观察结果可以发
9、现,每遍历一遍,R4R11所有值增1,循环次数为8,如此实现了8次赋值。实验截图中为R1减到7时,此时赋值进行到R5,R5之前赋值两次,依次为3、4,R5之后赋值一次,依次为4、5、6、7、8、9。3.3 实验三 ARM汇编指令实验3-ARM处理器工作模式实验源程序:usr_stack_legth equ 64svc_stack_legth equ 32fiq_stack_legth equ 16irq_stack_legth equ 64abt_stack_legth equ 16und_stack_legth equ 16 area reset,code,readonly entry co
10、de32 start mov r0, #0 mov r1, #1 mov r2, #2 mov r3, #3 mov r4, #4 mov r5, #5 mov r6, #6 mov r7, #7 mov r8, #8 mov r9, #9 mov r10, #10 mov r11, #11 mov r12, #12 bl initstack ;初始化各模式下的堆栈指针 ;打开irp中断(将cpsr寄存器的i位清零) mrs r0, cpsr ;r0-cpsr bic r0, r0, #0x80;开irq中断 msr cpsr_cxsf,r0;cpsr-r0 ;切换到用户模式 msr cpsr
11、_c, #0xd0 ;cpsr-#0xd0 通用寄存器到状态寄存器 mrs r0, cpsr ;r0-cpsr 状态寄存器到通用寄存器 stmfd sp!, r1-r11 ;? ;切换到管理模式 msr cpsr_c, #0xdf mrs r0, cpsr stmfd sp!, r1-r12halt b haltinitstack mov r0, lr ;r0-1r,因为各种模式下r0是相同的,而各个模式? ;设置管理模式堆栈 msr cpsr_c, #0xd3 ;110 10011 cpsr4:0 ldr sp, stacksvc stmfd sp!, r1-r12 ;设置中断模式堆栈 ms
12、r cpsr_c, #0xd2 ;110 10010 ldr sp, stackirq stmfd sp!, r1-r12 ;设置快速中断模式堆栈 msr cpsr_c, #0xd1 ;110 10001 ldr sp, stackfiq stmfd sp!, r1-r12 ;设置中止模式堆栈 msr cpsr_c, #0xd7 ;110 10111 ldr sp, stackabt stmfd sp!, r1-r12 ;设置未定义模式堆栈 msr cpsr_c, #0xdb ;110 11011 ldr sp, stackund stmfd sp!, r1-r12 ;设置系统模式堆栈 msr
13、 cpsr_c, #0xdf ;110 11111 ldr sp, stackusr stmfd sp!, r1-r12 mov pc, r0 ;返回 stackusr dcd usrstackspace+(usr_stack_legth-1)*4stacksvc dcd svcstackspace+(svc_stack_legth-1)*4stackirq dcd irqstackspace+(irq_stack_legth-1)*4stackfiq dcd fiqstackspace+(fiq_stack_legth-1)*4stackabt dcd abtstackspace+(abt_
14、stack_legth-1)*4stackund dcd undstackspace+(und_stack_legth-1)*4 area reset,data,noinit,align=2usrstackspace space usr_stack_legth*4svcstackspace space svc_stack_legth*4irqstackspace space irq_stack_legth*4fiqstackspace space fiq_stack_legth*4abtstackspace space abt_stack_legth*4undstackspace space
15、und_stack_legth*4 end实验结果截图:以上截图为模式设置的寄存器值变化情况。由cpsr可看出各个模式的设置过程。以上截图为运行界面截图。以上截图为复位后,寄存器值变化。由此可以看出,复位后cpsr的值是0x000000D3,处于管理模式。实验结果分析: 1.快速中断FIQ模式与其他模式存入的R1R12不同,FIQ模式下R8R12均变为0,分组寄存器的内容受保护。 2.切换到用户模式之后之后不可以从用户模式切换到其他模式,比如系统模式。只有特权模式下可以切换到别的模式。 3.用户模式之下可以执行堆栈压栈操作。 4.模式切换过程中spsr无变化,用户模式下spsr不可用,特权模式
16、下才可用。上文截图中spsr发生变化是因为那时处于特权模式下设置过程。3.4 ARM汇编与C混合编程实验-ARM启动过程控制实验源程序: IMPORT main area Init,code,readonly entry code32 ;*异常矢量入口表*start b Reset_HandlerUndefined_Handler b Undefined_HandlerSWI_Handler b SWI_HandlerPrefetch_Handler b Prefetch_HandlerAbort_Handler b Abort_Handler nop ;ReservedvectoIRQ_Ha
17、ndler b IRQ_HandlerFIQ_Handler b FIQ_HandlerReset_Handler bl initstack ;初始化各模式下的堆栈指针 ;切换到用户模式堆 msr cpsr_c,#0xd0 ;110 10000 bl main halt b haltinitstack mov r0,lr ;r0-lr,因为各模式下r0是相同的而各个模式? ;设置管理模式堆栈 msr cpsr_c,#0xd3 ;110 10011 ldr sp,stacksvc ;设置中断模式堆栈 msr cpsr_c,#0xd2 ;110 10010 ldr sp,stackirq ;设置快
18、速中断模式堆栈 msr cpsr_c,#0xd1 ;110 10001 ldr sp,stackfiq ;设置中止模式堆栈 msr cpsr_c,#0xd7 ;110 10111 ldr sp,stackabt ;设置未定义模式堆栈 msr cpsr_c,#0xdb ;110 11011 ldr sp,stackund ;设置系统模式堆栈 msr cpsr_c,#0xdf ;110 11111 ldr sp,stackusr mov pc, r0 ;返回 LTORG stackusr dcd usrstackspace+128stacksvc dcd svcstackspace+128stac
19、kirq dcd irqstackspace+128stackfiq dcd fiqstackspace+128stackabt dcd abtstackspace+128stackund dcd undstackspace+128 area Interrupt,data,READWRITEusrstackspace space 128svcstackspace space 128irqstackspace space 128fiqstackspace space 128abtstackspace space 128undstackspace space 128 end#include int
20、 main() extern void delayxms(int xms); int i=100; while(1) delayxms(1000); i-; if(i=0) i=100; return 0;* EXPORT delayxms area delay,code,readonly code32 ;下面是延时若干秒子程序delayxms stmfd sp!,r11; sub r0,r0,#1 ;r0=r0-1 ldr r11, =1000loop2 sub r11,r11,#1 cmp r11,#0x0 bne loop2 cmp r0,#0x0 ;将r0与0比较 bne delayx
21、ms ;比较结果不为0,继续调用delayxms ldmfd sp!,r11; mov pc,lr ;返回 end 源程序分为三部分加入工程中,如下图所示:设置三个程序的链接顺序,如下图所示:实验结果截图:4.2 实验五 ARM硬件接口实验1-基本IO实验按照实验课本上的步骤敲入程序,将程序烧到开发板上,实验结果拍照如下直接运行时跑马灯顺时针轮换变亮,按下按键后,变为逆时针轮换变亮。4.3 实验六 ARM硬件接口实验2-外部中断实验本实验将按钮开关所连接的GPF5引脚设定为外部中断EINT5,中断模式位IRQ,在中断服务程序中完成LED灯的切换,即正常状态时LED5灯亮,按下按钮开关时LED6灯亮。硬件实现如上图所示。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1