嵌入式实验报告Word文件下载.docx
《嵌入式实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《嵌入式实验报告Word文件下载.docx(23页珍藏版)》请在冰豆网上搜索。
R3做循环计数器,赋值为8
compare
SUBR3,R3,#1;
实现R3自减
CMPR3,#0;
比较R3和0,确定循环是否结束
BEQover;
若R3等于0,结束循环
LDRR4,[R0],#4
CMPR4,R1;
比较R4和R1,找大值
BLTsmall1;
小于跳转
MOVR1,R4
small1CMPR4,R2;
比较R4和R2,找小值
BLTsmall2;
BGTcompare;
大于跳转
small2MOVR2,R4
Bcompare
over
B.
AREADatapool,DATA,READWRITE
DataBufDCD11,-2,35,47,96,63,128,-23;
数据的定义采用伪指令DCD实现
END
遍历完成后,数据的最大值和最小值都已经找出,其中最大值存放在R1中,最小值存放在R2中。
由结果可知,R1中为0x00000080,即为128,R2中为0xFFFFFFE9,即为-23。
实验3.2ARM汇编指令实验2-字符串拷贝实验
1、例题
AREAInit,CODE,READONLY
CODE32
START
MOVSP,#0x400;
堆栈地址
LDRR0,=Src;
将初始字符串地址给R0
LDRR1,=Dst;
将目的字符串地址给R1
MOVR3,#0;
给R3赋值0
strcopy
LDRBR2,[R0],#1;
把R0给R2后加一
CMPR2,#0;
比较R2和0,检测字符串是否结束
BEQendcopy;
等于跳转到结束
STRBR2,[R1],#1;
把R2给R1后R1+1
ADDR3,R3,#1;
R3自加
Bstrcopy;
循环
endcopy
LDRR0,=ByteNum;
把字符数的地址给R0
STRR3,[R0];
把R3的值放到R0中
B.
AREADatapool,DATA,READWRITE
SrcDCB"
string\0"
;
初始字符串存储空间
DstDCB0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;
目的字符串存储空间
ByteNumDCD0
实验截图:
由程序可知,初始状态是R0存放起始字符串,R1存放目的字符串,R3赋初值0,拷贝字符串过程中,R3作为计数变量,每次自增一,拷贝借用R2做中转寄存器,每次复制到R2一个字符都要检查是否为0,若为0则字符串已经拷贝完毕,跳转到endcopy,若不为0则继续循环拷贝,直到结束。
最后将技术变量的值存放到到R0中。
实验结果截图可知,R0中为字符串长度,R1为目的字符串。
2、练习题
R4~R11起始值为1~8,每次加操作后把R4~R11的内容放入SP栈中,SP初始设置为0x800,最后把R4~R11清空赋值为0。
多字的加载与存储使用多寄存器寻址,使用的指令为LDM和STM。
ENTRY
CODE32
start
MOVSP,#0X800
LDRR0,=src;
把src的地址赋给R0
LDRR2,=str;
把str的地址赋给R2
MOVR1,#8
LDMIAR2!
{R4-R11};
将以R2起始地址的值存入R4-R11
MOVR4,#1
MOVR5,#2
MOVR6,#3
MOVR7,#4
MOVR8,#5
MOVR9,#6
MOVR10,#7
MOVR11,#8;
给寄存器赋初值
loop
ADDR4,R4,#1
ADDR5,R5,#1
ADDR6,R6,#1
ADDR7,R7,#1
ADDR8,R8,#1
ADDR9,R9,#1
ADDR10,R10,#1
ADDR11,R11,#1;
赋值的循环部分,给每一个寄存器赋原值加一
STMIASP!
SUBSR1,R1,#1;
循环变量R1自减1
BNEloop;
不为0返回循环
LDMIAR0!
将以R0起始地址的值存入R4~R11
HALTBHALT;
停留,循环
srcDCD0,0,0,0,0,0,0,0
进行步的运行,观察结果可以发现,每遍历一遍,R4~R11所有值增1,循环次数为8,如此实现了8次赋值。
实验截图中为R1减到7时,此时赋值进行到R5,R5之前赋值两次,依次为3、4,R5之后赋值一次,依次为4、5、6、7、8、9。
3.3实验三ARM汇编指令实验3---ARM处理器工作模式实验
usr_stack_legthequ64
svc_stack_legthequ32
fiq_stack_legthequ16
irq_stack_legthequ64
abt_stack_legthequ16
und_stack_legthequ16
areareset,code,readonly
entry
code32
movr0,#0
movr1,#1
movr2,#2
movr3,#3
movr4,#4
movr5,#5
movr6,#6
movr7,#7
movr8,#8
movr9,#9
movr10,#10
movr11,#11
movr12,#12
blinitstack;
初始化各模式下的堆栈指针
;
打开irp中断(将cpsr寄存器的i位清零)
mrsr0,cpsr;
r0<
--cpsr
bicr0,r0,#0x80;
开irq中断
msrcpsr_cxsf,r0;
cpsr<
--r0
切换到用户模式
msrcpsr_c,#0xd0;
--#0xd0通用寄存器到状态寄存器
--cpsr状态寄存器到通用寄存器
stmfdsp!
{r1-r11};
?
切换到管理模式
msrcpsr_c,#0xdf
mrsr0,cpsr
{r1-r12}
haltbhalt
initstack
movr0,lr;
--1r,因为各种模式下r0是相同的,而各个模式?
设置管理模式堆栈
msrcpsr_c,#0xd3;
11010011cpsr[4:
0]
ldrsp,stacksvc
设置中断模式堆栈
msrcpsr_c,#0xd2;
11010010
ldrsp,stackirq
设置快速中断模式堆栈
msrcpsr_c,#0xd1;
11010001
ldrsp,stackfiq
设置中止模式堆栈
msrcpsr_c,#0xd7;
11010111
ldrsp,stackabt
设置未定义模式堆栈
msrcpsr_c,#0xdb;
11011011
ldrsp,stackund
设置系统模式堆栈
msrcpsr_c,#0xdf;
11011111
ldrsp,stackusr
movpc,r0;
返回
stackusrdcdusrstackspace+(usr_stack_legth-1)*4
stacksvcdcdsvcstackspace+(svc_stack_legth-1)*4
stackirqdcdirqstackspace+(irq_stack_legth-1)*4
stackfiqdcdfiqstackspace+(fiq_stack_legth-1)*4
stackabtdcdabtstackspace+(abt_stack_legth-1)*4
stackunddcdundstackspace+(und_stack_legth-1)*4
areareset,data,noinit,align=2
usrstackspacespaceusr_stack_legth*4
svcstackspacespacesvc_stack_legth*4
irqstackspacespaceirq_stack_legth*4
fiqstackspacespacefiq_stack_legth*4
abtstackspacespaceabt_stack_legth*4
undstackspacespaceund_stack_legth*4
end
实验结果截图:
以上截图为模式设置的寄存器值变化情况。
由cpsr可看出各个模式的设置过程。
以上截图为运行界面截图。
以上截图为复位后,寄存器值变化。
由此可以看出,复位后cpsr的值是0x000000D3,处于管理模式。
实验结果分析:
1.快速中断FIQ模式与其他模式存入的R1~R12不同,FIQ模式下R8~R12均变为0,分组寄存器的内容受保护。
2.切换到用户模式之后之后不可以从用户模式切换到其他模式,比如系统模式。
只有特权模式下可以切换到别的模式。
3.用户模式之下可以执行堆栈压栈操作。
4.模式切换过程中spsr无变化,用户模式下spsr不可用,特权模式下才可用。
上文截图中spsr发生变化是因为那时处于特权模式下设置过程。
3.4ARM汇编与C混合编程实验---ARM启动过程控制实验
IMPORTmain
areaInit,code,readonly
;
*********异常矢量入口表*************
startbReset_Handler
Undefined_HandlerbUndefined_Handler
SWI_HandlerbSWI_Handler
Prefetch_HandlerbPrefetch_Handler
Abort_HandlerbAbort_Handler
nop;
Reservedvecto
IRQ_HandlerbIRQ_Handler
FIQ_HandlerbFIQ_Handler
Reset_Handler
blinitstack;
;
切换到用户模式堆
msrcpsr_c,#0xd0;
11010000
blmain
haltbhalt
initstackmovr0,lr;
--lr,因为各模式下r0是相同的而各个模式?
msrcpsr_c,#0xd3;
11010011
ldrsp,stacksvc
msrcpsr_c,#0xd2;
11010010
ldrsp,stackirq
msrcpsr_c,#0xd1;
ldrsp,stackfiq
msrcpsr_c,#0xd7;
11010111
ldrsp,stackabt
msrcpsr_c,#0xdb;
11011011
ldrsp,stackund
msrcpsr_c,#0xdf;
11011111
ldrsp,stackusr
movpc,r0;
LTORG
stackusrdcdusrstackspace+128
stacksvcdcdsvcstackspace+128
stackirqdcdirqstackspace+128
stackfiqdcdfiqstackspace+128
stackabtdcdabtstackspace+128
stackunddcdundstackspace+128
areaInterrupt,data,READWRITE
usrstackspacespace128
svcstackspacespace128
irqstackspacespace128
fiqstackspacespace128
abtstackspacespace128
undstackspacespace128
#include<
stdio.h>
intmain()
{
externvoiddelayxms(intxms);
inti=100;
while
(1)
{
delayxms(1000);
i--;
if(i==0)i=100;
}
return0;
}
*****************************
EXPORTdelayxms
areadelay,code,readonly
下面是延时若干秒子程序
delayxms
{r11};
subr0,r0,#1;
r0=r0-1
ldrr11,=1000
loop2
subr11,r11,#1
cmpr11,#0x0
bneloop2
cmpr0,#0x0;
将r0与0比较
bnedelayxms;
比较结果不为0,继续调用delayxms
ldmfdsp!
movpc,lr;
源程序分为三部分加入工程中,如下图所示:
设置三个程序的链接顺序,如下图所示:
4.2实验五ARM硬件接口实验1---基本IO实验
按照实验课本上的步骤敲入程序,将程序烧到开发板上,实验结果拍照如下
直接运行时跑马灯顺时针轮换变亮,按下按键后,变为逆时针轮换变亮。
4.3实验六ARM硬件接口实验2---外部中断实验
本实验将按钮开关所连接的GPF5引脚设定为外部中断EINT5,中断模式位IRQ,在中断服务程序中完成LED灯的切换,即正常状态时LED5灯亮,按下按钮开关时LED6灯亮。
硬件实现如上图所示。