嵌入式实验报告.docx
- 文档编号:25505598
- 上传时间:2023-06-09
- 格式:DOCX
- 页数:22
- 大小:1.40MB
嵌入式实验报告.docx
《嵌入式实验报告.docx》由会员分享,可在线阅读,更多相关《嵌入式实验报告.docx(22页珍藏版)》请在冰豆网上搜索。
嵌入式实验报告
实验一 ARM 汇编语言程序设计
一、实验目的
1. 了解 IAR Embedded Workbench 集成开发环境
2. 掌握 ARM 汇编指令程序的设计及调试
二、实验设备
1. PC 操作系统 WIN98 或 WIN2000 或 WINXP,ADSI.2 集成开发环境,
仿真驱动程序
三、实验内容
1. 熟悉 IAR Embedded Workbench 集成开发环境
2. 理解下列程序,新建工程,加入下面的程序,并观察实验结果,解
释程序实现的功能
分析:
该程序实现的功能是程序功能:
Y = A*B+C*D+E*F
程序代码:
AREA Examl, CODE,READONLY ;定义一个代码段
ENTRY;程序入口
MOV R0,#0;设置R0寄存器的值为0
MOV R8,#0;设置R8寄存器的值为0
ADR R2,N;将R2寄存器的值设为数据域N的地址
LDR R1,[R2];将以R2的值为地址的数据读入R1
MOV R2,#0;设置R2的值为0
ADR R3,C; 将R3寄存器的值设为数据域C的地址
ADR R5,X; 将R5寄存器的值设为数据域X的地址
LOOP
LDR R4,[R3,R8];将R3+R8的数据读入R4
LDR R6,[R5,R8];将R5+R8的数据读入R6
MUL R9,R4,R6;R9 = R4*R6
ADD R2,R2,R9;R2 = R2+R9
ADD R8,R8,#4;R8 = R8+4
ADD R0,R0,#1;R0 = R0+1
CMP R0,R1;比较R0和R1的值
BLT LOOP;R0 N DCD 0X03; C DCD 0X01,0X02,0X03,0X04,0X05,0X06; X DCD 0X01,0X02,0X03,0X04,0X05,0X06; END 程序结果: 各个寄存器的结果 执行结果如下: 3. 实现 1+2+3+4+····+100,求的值,并保存在地址 0x90018 的地 址里面 程序代码: MOV R0,#100;设置R0寄存器的值为100 LDR R2,=0X90018;设置R2寄存器指向地址0x90018 MOV R1,#0;设置R1的值为0 MOV R3,#0;设置R3的值为0 LOOP ADD R3,R3,R0;R3 = R3+R0 SUB R0,R0,#1;R0 = R0-1 CMP R0,R1;将R0和R1的值比较 BNE LOOP;不相等的话继续执行循环 STR R3,[R2];将R3的值装入到R2指向的地址块中。 END 程序执行结果: 程序执行完在 0x90018 内存入的数据是 0x13ba 即 5050 实验二 ARM 汇编语言程序设计 一、实验目的 1. 了解 ARM 汇编语言的基本框架,学会使用 ARM 的汇编语言编程; 2. 掌握 ARM 汇编指令中的堆栈指令的操作,以及存储器的装载指令操作。 二、实验设备 1.PC 操作系统 WIN98 或 WIN2000 或 WINXP, ADS1.2.集成开发环境,仿真 器驱动程序。 三、实验内容 1. 理解下列程序,新建工程,加入下面的程序,并观察实验结果 程序代码: x EQU 15;定义常量x=15 y EQU 61;定义常量y=61 stack_top EQU 0X1000;定义堆栈栈顶地址为0x1000 ENTRY;程序入口处 MOV sp,#stack_top;将堆栈指针指向栈顶 MOV r0,#x;将x的值放入r0 STR r0,[sp];将r0的值压入堆栈 MOV r0,#y;将y的值放入r0 LDR r1,[sp];将x的值放入r1 ADD r0,r0,r1;r0 = r0+r1 STR r0,[sp];将r0的值装入堆栈 Stop; B stop; 程序结果为: r1 = x+y = 0x6D 2. 编写程序循环R4~R11进行累加8次赋值,R4~R11初始值是1~8,每次操作后 把R4~R11的内容放到SP栈中,SP初始设置为0x800,最后把R4~R11用LDMFD 指令清空为0 程序代码如下: X EQU 1;定义常量x = 1 stack_top EQU 0X800;定义栈顶地址 ENTRY; MOV SP,#stack_top;将栈顶地址指向0x800 MOV R4,#1;设置R4 = 1 MOV R5,#2;设置R5 = 2 MOV R6,#3;设置R6 = 3 MOV R7,#4;设置R7 = 4 MOV R8,#5;设置R8 = 5 MOV R9,#6;设置R9 = 6 MOV R10,#7;设置R10 = 7 MOV R11,#8;设置R11 = 8 LOOP ADD R4,R4,#x; R4累加1 ADD R5,R5,#x; R5累加1 ADD R6,R6,#x; R6累加1 ADD R7,R7,#x; R7累加1 ADD R8,R8,#x; R8累加1 ADD R9,R9,#x; R9累加1 ADD R10,R10,#x; R10累加1 ADD R11,R11,#x; R11累加1 STMIA SP! {R4-R11};将R4-R11的值压入堆栈 CMP R4,#9;比较R4和9的大小 BLT LOOP;R4 < 9继续执行循环 LDMFD SP! {R4-R11};将R4-R11清零 END; 实验结果: 主要实现将数据2-9,3-10,4-11……9-16压入堆栈(初始地址是0x800处开始) ,最后将R4-R11全部清零。 3. 更改实验中1中的X,Y的值,观察期结果 程序代码: x EQU 20 y EQU 120 stack_top EQU 0X1000 ENTRY MOV sp,#stack_top MOV r0,#x STR r0,[sp] MOV r0,#y LDR r1,[sp] ADD r0,r0,r1 STR r0,[sp] Stop B Stop END 程序结果为: r0 = x+y = 140 = 0X8C 实验三 ARM 汇编语言程序设计 一、实验目的 1.了解 ARM 汇编语言的基本框架,学会使用 ARM 的汇编语言编程 2.掌握 ARM 汇编的存储器加载/存储指令,及 if 条件、循环、循环及循环的汇 编实现 二、实验设备 1.PC 操作系统 WIN98 或 WIN2000 或 WINXP,ADS1.2 集成开发环境,仿真器驱 动程序 三、实验内容 1. 理解下列程序,新建工程,加入下面的程序,并观察实验结果 程序代码: Num EQU 20;定义常量Num = 20 START; LDR r0,=src;将src数据块的开始地址存入r0中 LDR r1,=dst; 将dst数据块的开始地址存入r1中 MOV r2,#Num;设置r2的值为20 MOV sp,#0x400;堆栈指针sp指向0x400 blockcopy; MOVS r3,r2,LSR #3;将r2左移3位移入r3并且影响标志位 BEQ copywords;结果为0的话跳转到copywords STMFD SP! {r4-r11};将r4-r11的值入栈 octcopy; LDMIA r0! {r4-r11};将src的前8个字数据存入让r4-r11 STMIA r1! {r4-r11};将r4-r11中的数据放入dst数据块中 SUBS r3,r3,#1;r3 = r3-1 BNE octcopy;结果不为0跳转到octcopy LDMFD SP! {R4-R11};恢复原来的r4-r11 copywords; ANDS r2,r2,#7; r2 = r2&7 BEQ stop;结果为0跳转到stop wordcopy; LDR r3,[r0],#4;将r0指向的字数据放入r3中,r0 = r0+4 STR r3,[r1],#4;将r3中的数据存入到dst数据块中,r1 = r1+4 SUBS r2,r2,#1;r2 = r2 -1 BNE wordcopy;不为0跳转到wordcopy处 stop; B stop; src DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4; dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; END; 程序结果: 将src的数据全部存入到dst中 2. 新建工程,并自行编写程序,分别使用LDR,STR,LDMIA,STMIA操作,实现对某段连 续存储单元写入数据,并观察结果 程序代码: MOV R4,#1;设置r4 = 1; MOV R5,#2; 设置r5 = 1; MOV R6,#3;设置r4 = 1; LDR R0,=dst;R0保存dst的首地址 STR R4,[R0];将r4的值装入r0执行的内存中 STR R5,[R0,#4]; 将r5的值装入r0+4执行的内存中 STR R6,[R0,#8]; 将r6的值装入r0+8执行的内存中 LDR R7,=src; R0保存src的首地址 LDMIA R7,{R8-R10};将r7执行的地址的数据读入r8=r10 LDR R3,=N;r3保存N的首地址 STMIA R3! {R8-R10};将r8-r10装入r3指向的内存 N DCD 0,0,0 src DCD 1,2,3 dst DCD 0,0,0 END 程序结果: 熟悉使用LDMIA,STMIA和LDR,STR指令 3. 使用ARM汇编指令实现if条件执行,使用ARM汇编指令实现for条件执行, 使用ARM汇编指令实现while条件执行,使用ARM汇编指令实现do…while条件执行。 程序代码: 实现if条件: MOV R0,#1 MOV R1,#2 CMP R0,R1 BGT LOOP1 BLT LOOP2 LOOP1 MOV R3,R0 LOOP2 MOV R3,R1 END 程序结果: 实现for和while条件: MOV R1,#1 MOV R3,#0 MOV R2,#101; LOOP ADD R3,R1,R3 ADD R1,R1,#1 CMP R1,R2 BLT LOOP END 程序结果: 实现do…while条件: MOV R0,#1 MOV R1,#100 MOV R3,#0 LOOP CMP R0,R1 BGT STOP ADD R3,R0,R3 ADD R0,R0,#1 B LOOP STOP END 程序结果: 实验四基于 ARM 的 C 语言程序设计 一、实验目的 1.了解 ARM C 语言的基本框架,学会使用 ARM 的 C 语言编程。 2. 掌握 C 语言和汇编语言编程的相互调用。 二、实验设备 1. EL-ARM-830 教学实验箱,PentiumII 以上的 PC 机,仿真器电缆。 三、ARM C 语言简介与使用规则 1. ARM 使用 C 语言编程是大势所趋 在应用系统的程序设计中,若所有的编程任务均由汇编语言来完成,其工作量巨大, 并且不宜移植。 由于 ARM 的程序执行速度较高,存储器的存储速度和存储量也很高, 因此,C 语言的特点充分发挥,使得应用程序的开发时间大为缩短,代码的移植十 分方便,程序的重复使用率提高,程序架构清晰易懂,管理较为容易等等。 因此, C 语言的在 ARM 编程中具有重要地位。 2. ARM C 语言程序的基本规则 在 ARM 程序的开发中,需要大量读写硬件寄存器,并且尽量缩短程序的执行时间 的代码一般使用汇编语言来编写,比如 ARM 的启动代码,ARM 的操作系统的移植 代码等,除此之外,绝大多数代码可以使用 C 语言来完成。 C 语言使用的是标准的 C 语言,ARM 的开发环境实际上就是嵌入了一个 C 语言的集 成开发环境,只不过这个开发环境和 ARM 的硬件紧密相关。 在使用 C 语言时,要用到和汇编语言的混合编程。 当汇编代码较为简洁,则可使 用直接内嵌汇编的方法,否则,使用将汇编文件以文件的形式加入项目当中,通 过 ATPCS 的规定与 C 程序相互调用与访问。 ATPCS,就是 ARM、Thumb 的过程调用标准(ARM/ThumbProcedureCall Standard),它规定了一些子程序间调用的基本规则。 如寄存器的使用规则,堆栈 的使用规则,参数的传递规则等。 在 C 程序和 ARM 的汇编程序之间相互调用必须遵守 ATPCS。 而使用 ADS 的 C 语言 编译器编译的 C 语言子程序满足用户指定的 ATPCS 的规则。 但是,对于汇编语言 来说,完全要依赖用户保证各个子程序遵循 ATPCS 的规则。 具体来说,汇编语言 的子程序应满足下面 3 个条件: ● 在子程序编写时,必须遵守相应的 ATPCS 规则; ● 堆栈的使用要遵守相应的 ATPCS 规则; ● 在汇编编译器中使用-atpcs 选项。 基本的 ATPCS 规定,请详见相关技术文档。 汇编程序调用 C 程序 汇编程序的设置要遵循 ATPCS 规则,保证程序调用时参数正确传递。 在汇编程序中使用 IMPORT 伪指令声明将要调用的 C 程序函数。 在调用 C 程序时,要正确设置入口参数,然后使用 BL 调用。 C 程序调用汇编程序 汇编程序的设置要遵循 ATPCS 规则,保证程序调用时参数正确传递。 在汇编程序中使用 EXPORT 伪指令声明本子程序,使其他程序可以调用此子程序。 在 C 语言中使用 extern 关键字声明外部函数(声明要调用的汇编子程序)。 在 C 语言的环境内开发应用程序,一般需要一个汇编的启动程序,从汇编的启动 程序,跳到 C 语言下的主程序,然后,执行 C 程序,在 C 环境下读写硬件的寄存 器,一般是通过宏调用,在每个项目文件的 Startup44b0/INC 目录下都有一个 44b.h 的头文件,那里面定义了所有关于 44B0 的硬件寄存器的宏,对宏的读写, 就能操作 44B0 的硬件。 具体的编程规则同标准 C 语言。 四、实验内容 1、理解下列程序,新建工程,加入下面的程序,并观察实验结果。 程序代码: /*实现 5 个数的相加*/ int sum5(int a,int b,int c,int d,int e){ return (a+b+c+d+e); } ;汇编语言 IMPORT sum5;声明调用c函数 CALLSUMS STMFD SP! {LR};将LR寄存器入栈 MOV R0,#1;r0 = 1 ADD R1,R0,R0;r1 = 2 ADD R2,R1,R0;r2 = 3 ADD R3,R1,R2;r3 = 5 STR R3,[SP,#-4]! ;将r3的值入栈当做第五个参数 ADD R3,R1,R1;R3 = R3+R1=4 BL sum5;调用sum5 ADD SP,SP,#4;sp = sp+4 LDMFD SP,{PC} 程序结果: 实现了 i+2i+3i+4i+5i 的汇编语言调用 c 语言 2、用汇编语言实现 1 到 100 累加的函数,用 C 言语编写主程序,在主程序中调用所编写的 汇编函数 程序代码: NAMEasmfile PUBLIC sum5 SECTION .intvec : CODE (2) CODE32 sum5 ENTRY MOV R1,#1 MOV R2,#0 sum6 ADD R2,R1,R2 ADD R1,R1,#1 CMP R1,R0 BLE sum6 MOV PC,LR END #include extern void sum5(int x); int main(void){ const int n = 100; sum5(n); return(0); } 程序结果: 总结 本次实验主要是通过对ARM的各种指令进行操作,通过对这些指令的应用, 让我们学会了如何使用汇编来进行编程,掌握汇编编程和C语言编程的技巧,并 且能够熟练的使用汇编语言,深刻理解ARM的工作。 并且培养了我们写代码的能 力以及对代码的阅读能力和修改能力。 为我们在以后的学习和生活中更实用ARM,利 用汇编进行编程奠定了一定的基础!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 实验 报告