电子科技大学.docx

上传人:b****5 文档编号:29108410 上传时间:2023-07-20 格式:DOCX 页数:18 大小:1.14MB
下载 相关 举报
电子科技大学.docx_第1页
第1页 / 共18页
电子科技大学.docx_第2页
第2页 / 共18页
电子科技大学.docx_第3页
第3页 / 共18页
电子科技大学.docx_第4页
第4页 / 共18页
电子科技大学.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

电子科技大学.docx

《电子科技大学.docx》由会员分享,可在线阅读,更多相关《电子科技大学.docx(18页珍藏版)》请在冰豆网上搜索。

电子科技大学.docx

电子科技大学

电子科技大学

实验报告

 

课程名称微处理器系统结构与嵌入式系统设计

实验名称ARM汇编基础实验

任课教师

实验教师

姓名

学号

实验地点

分组号

时间

一、实验目的

1.熟悉并掌握常用ARM汇编指令

2.熟悉并掌握“C+汇编”混合编程技术

3.熟练使用ARM软件开发调试工具Keil

二、实验内容

1.学习使用Keil开发工具

2.实现累加运算功能(汇编编程,必做)

3.实现字符串拷贝功能(C+汇编,必做)

4.实现求和运算功能(C+汇编,必做)

5.实现冒泡排序算法(汇编编程,选做)

微处理器系统结构与嵌入式系统设计实验报告

三、实验步骤

1.学习使用keil开发工具

1.点击“KeiluVision5”打开软件主窗口。

2.点击Project->NewuVisionProject建立新工程。

3.为新工程命名。

4.为工程选择目标器件:

三星S3C2440A。

5.选择是否添加S3C2440.s启动文件:

C源程序工程选“是”,汇编源程序工程选“否”。

6.在工程SourceGroup上点右键选择添加新工程文件。

7.选择源文件类型。

8.录入源代码并保存。

9.对工程进行build或rebuild。

10.点击debug按钮进入/退出调试,忽略代码大小限制。

使用单步调试,仔细观察过程中关键寄存器值的变化。

2.各个实验步骤

实验1.1:

用汇编语言实现1+2+...+N的累加(必做)

1.建立新工程,加入实验1.2文件夹中的sum.s

2.用汇编补充算法核心部分,代码参考流程图如下图所示。

3.使用单步调试,仔细观察过程中关键寄存器值的变化。

实验1.2:

C调用汇编实现字符串拷贝功能(必做)

1.建立新工程,加入实验1.3文件夹中的main.c和testfile.s(同一个工程下添加两个文件一起编译)。

2.补充完成源代码中缺失的部分,实现字符串拷贝功能

3.运行Debug进行调试

实验1.3:

汇编调用C实现实现求和1+2+...+N(必做)

1.建立新工程,加入实验1.4文件夹中的sum.c和testfile.s(同一个工程下添加两个文件一起编译)。

2.补充完成源代码中缺失的部分,通过调用c函数g()实现1+2+3+glovb1,结果存在R8中。

3.运行Debug进行调试

实验1.4:

ARM汇编实现冒泡算法(选做)

1.建立新工程,加入实验1.5文件夹中的maopao.s。

2.补充完成源代码中缺失的部分,实现冒泡排序功能。

3.运行Debug进行调试

四、实验结果

实验1.1用ARM汇编实现1+2+…+n的运算。

在sum.s文件中,添加如下核心代码:

-------------------------------------------------------------------------------------------------------------------------

SUN_L1

ADDR0,R1;R0,R1求和

BVSSUM_END;判断是否溢出,溢出则执行SUM_END程序,求和结束

CMPR1,R2;R1、R2作差与0进行比较

BHSSUM_END;R1>=R2,则执行SUM_END程序,否则向下继续执行

ADDR1,#1;R1增1

BSUN_L1;循环运行SUN_L1

调试过程:

1.设置N的值并赋值给R0

2.将R0=N的值复制给R2

3.判断N是否为0或者,改变标志位C

4.将R0,R1分别初始化为0与1

5.将R0+R1赋值给R0

6.判断是否溢出与R1是否大于等于R2=N,改变标志位N

7.令R1+1赋值给R1

8.通过B语句返回SUN_L1函数,实现循环相加

9.此时判断到R1大于等于R2=100,改变标志位

10.跳转到SUM_END函数,并将R0的结果保存在R8中

11.出栈并返回函数,完成1到N=100的累加,结果保存在R8中

实验1.2:

C调用汇编实现字符串拷贝功能(必做)

在testfile.s文件中,添加如下核心代码:

-------------------------------------------------------------------------------------------------------------------------

Strcopy

LDRBR2,[R1],#1;R1对应源字符串首地址,利用寄存器间接寻址读取字符串到R2

STRBR2,[R0],#1;R0对应目的字符串首地址,利用寄存器间接寻址保存字符

CMPR2,#0

BNEstrcopy

MOVPC,LR

END;文件结束

调试过程

1.定义源字符串数组“aaaa”

2.定义目标字符串“bbbb”

3.进入汇编程序strcopy

4.将源字符串的首地址R1赋值给R2,并让R1加一位,指示源字符串下一位的地址

5.将R2地址代表的字符赋值给目标字符串组首地址R0的内容,并将R0加一位,指示目标字符串的下一位地址

6.判断R2即源字符串地址内容是否为0,即是否复制完毕,并改变标志位

7.判断标志位是否复制完毕,未复制完毕,继续返回函数循环

8.复制完四次后改变标志位

9.R2=0表示已复制完毕,返回主函数,可见已将源字符串复制到目标字符串中

 

实验1.3:

汇编调用C实现实现求和1+2+...+N(必做)

在testfile2.s文件中,添加如下核心代码:

通过调用C函数g()实现1+2+3+glovbl,结果存在R8中。

-------------------------------------------------------------------------------------------------------------------------

MOVR0,#1;R0赋值为1

MOVR1,#2;R1赋值为2

MOVR2,#3;R2赋值为3

MOVR3,#10;R3赋值为10

BLg;调用C语言中的函数g()

MOVR8,R0;将结果存在R8中

BSTART

-------------------------------------------------------------------------------------------------------------------------

调试过程:

1.将R0赋值为1

2.将R1赋值为2

3.将R2赋值为3

4.将R3赋值为10

5.通过BL指令调用C程序g

6.执行C程序中的a+b+c+d,并将结果赋值给R0

7.C程序执行完,回到主程序,并将R0的值赋值给R8

 

1)在实验1中,通过伪指令EQU,定义N的值。

编译运行后,通过跟踪、调试,实现了对1+2+…n的累加运算。

2)在实验二中,编译运行后,经过跟踪调试,实现在C语言中调用函数strcopy.

3)在实验中,编译运行后,经过跟踪调试,实现了在汇编语言中调用C语言中的全局变量和全局函数。

微处理器系统结构与嵌入式系统设计实验报告

六、实验总结

在本次实验中,通过汇编程序直接对ARM处理器中的寄存器进行操作,掌握了汇编程序设计的基础知识。

更全面、更深入地理解了ASM处理器的工作原理,为基于ARM处理器的嵌入式硬件开发奠定良好的基础。

在嵌入式软件开发过程中,通常会使用ARM汇编语言和C语言在内的多种语言,通过本次实验,初步认识了ARM汇编语言与高级程序设计语言混合编程的原理和基本方法。

七、实验思考题

1.ADD替换成ADDS,SUB替换成SUBS有什么影响?

答:

ADD指令与ADDS指令的区别在于,ADDS指令运算过程中是带进位的,运算过程中将会根据结果来更新N、Z、C和V标记位,所以如果计算过程中需要进位,则二者不可交换,若不涉及进位,则无影响。

SUB与SUBS类似,是用来做减法计算的。

2.MOV替换成MOVNE有什么影响?

答:

MOV是单纯的传送指令,而MOVNE需要先判断条件NE,即要上一步计算结果不相等才执行。

3.STMIA换成STMIB,STMIA换成STMDA有什么区别?

答:

STMIA指令完成操作后地址递增,而STMIB是指令完成前递增。

STMIA指令是完成后地址递增,STMDA指令完成操作而后地址递减。

4.思考用ARM汇编实现1+3+5+…+(2n+1)或者2+4+6+…+2n。

答:

奇数求和:

设置初始值R0=0,R1=1,令R0=R0+R1,判断是否溢出,若是,结束程序,若否再判断R1是否大于等于2n+1,若是,结束程序,若否则令R1=R1+2,再回到程序开始出执行。

偶数求和:

只需要令初始R0=0,R1=2即可.

5.实验3中如果去除汇编代码中的“EXPORTstrcopy”会有什么现象,为什么?

答:

编译无法通过,如果去除则C语言程序无法调用strcopy函数,EXPORT伪指令用于在程序中声明一个全局的标号,让该标号可以在其他的文件中被引用。

6.实验4中如果去除汇编代码中的“IMPORT…..”会有什么现象,为什么?

答:

如果去除则汇编语言程序无法调用C语言的main函数,IMPORT伪指令用于通知编译器要使用的标号或变量在其他的源文件中定义了。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1