《ARM汇编实验报告(共18页).docx》由会员分享,可在线阅读,更多相关《ARM汇编实验报告(共18页).docx(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上嵌入式系统原理与应用B课程实验报告 ARM汇编语言编程与调试要求完成的主要实验1、 给出的数据中寻找最大、最小数问题2、 两种求和运算的编程与调试3、 第四章作业第9题4、 排序冒泡程序的调试与总结5、 第四章作业第11题说明:标注完成的实验,未完成的给予说明专业名称: 通信工程班 级: 1510班 学生姓名: 石龙飞学号(8位): 指导教师: 刘钊远给出的数据中寻找最大、最小数问题一、 实验目的1、学习汇编软件的安装、使用,熟悉汇编环境。2、学会使用汇编软件,如何新建一个工程,如何书写源代码,如何进行链接、编译,以及如何调试。3、尝试一些简单的指令,学会用汇编指令写
2、一些简单的程序。二、 实验内容编写一个汇编程序,要求在给定的一组数中找到最大数和最小数。三、 实验主要步骤1、首先建立一个工程2、再新建.s的源文件,添加到工程中3、编写源代码,这里主要是实现在一组数中寻找最大数和最小数,最后将找到的两个数放到相应的寄存器中。4、进行链接编译,看看有没有语法的错误,如果有错误编译器会提示错误的类型以及在哪里出错。5、进行debug调试,查找代码中的逻辑错误,若无逻辑错误,可在debug界面查看运行结果,其最需要的关注的几个地方是菜单栏的一组运行按钮、源码执行的步骤以及断点、左边的寄存器状态、下方的存储器状态,将这些综合起来,就可以很明确的回到程序如何运行,运行
3、结果如何。四、 实验代码AREA symbol,CODE,READONLY ENTRY CODE32STARTLDR R0, =nums MOV R2, #1 INITNUMSSTRR2, R0, #4ADDR2, R2, #2CMPR2, #101BNEINITNUMSLDRR0, =numsLDRR2, R0LDRR3, R0MOVR1, #1FINDMAXMINLDRR4, R0, #4CMPR2, R4MOVCCR2, R4CMPR3, R4MOVCSR3, R4ADDR1, R1, #1CMPR1, #101BNEFINDMAXMINSTOPbSTOP AREA Data, DATA
4、, READWRITEnumsSPACE100 END五、 实验总结与分析1、 实验结果分析其中用红色方框框起来的是最后程序运行的结果,也就是在R3中保存了最小数在R2中保存了最大数,完成了实验要求。2、在用汇编语言编程之前首先要看看有没有汇编软件ADS、没有的话需要安装,Windows XP安装起来比较简单,只需要点击setup,一直点击写一部就可以,但是如果是Windows 7或者更高版本的话就需要在setup的属性里点击兼容Windows XP,运行时以管理员身份运行才能正确进行安装。两种求和运算的编程与调试一、 实验目的1、掌握循环的使用技巧,主要确定循环的上下界,以及循环体里需要执行
5、的代码,防止一些越界的操作。2、尝试不同的求和运算的算法。二、 实验内容给定一个正整数,求从零到这个数的所有整数的和。简单得对问题进行分析可知,这个功能能过用两种方式实现,一种是循环,一种是直接用求和公式计算出来,如果从算法的时间复杂度来说,那肯定是后者时间复杂度低,只有O(1),但是从学习的角度,还是要练习一下循环结构,因此,这里主要用循环语句实现,以研究其中的问题。三、 实验主要步骤1、打开ADS,新建一工程,再新建一个.s的源文件,将其添加到工程中去,开始编写源代码。2、链接、编译源文件,检查语法错误3、用debug进行调试,观察寄存器的状态,在stop前打断点,全速运行代码,这样就可以
6、在代码最后天下来,查看运行结果。四、 实验代码AREA symbol,CODE,READONLY ENTRY CODE32STARTLDR R0, =sum MOV R1, #100 MOV R2, #0 MOV R3, #0LOOP ADD R2, R2, #1 ADD R3, R3, R2 SUBR1, R1, #1 CMP R1, #0 BNE LOOP STRCSR3, R0STOP MOV R0, #0x18 LDR R1, =0x20026 AREA Data, DATA, READWRITEsum DCD 0END五、 实验总结与分析1、 实验结果分析用红色框圈起来的是最后执行的
7、结果,也就是将最后0100的和放在了R3中,是0x13BA,二这个程序采用的是循环的方式求1100的和,所以最后一个数字是100,正是R2中的0x64。2、实验总结:因为这个程序里用到了循环语句,所以就有几个点需要注意,也就是循环的上下界和循环体力边的语句。在代码实现中,将R1寄存器的值置为100,然后再循环体里每次减一,然后和0进行比较,大于零的话继续,小于等于零的话就跳出循环。这里容易出错的地方就是最后到底是和谁比较或者R1的初值给多少合适。再循环体里主要做了两件事,R2从零开始每次加一,而R3就是截止目前所有数的和。排序冒泡程序的调试与总结一、 实验目的1、更加深入理循环程序设计,注意循
8、环嵌套中的一些问题,比如条件判断、步长、两层循环中间的代码设计。2、深入学习掌握debug调试的使用技巧,以及存储器窗口数据的观察,在存储器中找到代码需要的地址。3、学会如何遍历存储在存储器中的数据,将其读入寄存器进行处理。二、 实验内容利用冒泡排序将给定的一组数进行排序,这里采用升序,在排序完和排序后查看存储器的状态,检查排序是否成功。三、 实验主要步骤1、打开ADS,新建一工程,再新建一个.s的源文件,将其添加到工程中去,开始编写源代码。2、链接、编译源文件,检查语法错误。3、用debug进行调试,观察寄存器的状态,在stop前打断点,全速运行代码,这样就可以在代码最后天下来,查看运行结果
9、。四、 实验代码AREA symbol,CODE,READONLY ENTRY CODE32START MOV R0, #0FOR1LDRR2, =numsMOVR1, #0FOR2LDRR3, R2LDRR4, R2, #4CMPR3, R4LDRGTR5, R2, #4STRGTR3, R2, #4STRGTR5, R2ADDR2, R2, #4ADDR1, R1, #1CMPR1, #9BCCFOR2ADDR0, R0, #1CMPR0, #9BCCFOR1 AREA Data, DATA, READWRITEnumsDCD12, 3, 45, 1, 44, 100, 0, 12, 10
10、, 3 END 五、 实验总结与分析1、 实验分析第一张图为排序前寄存器以及存储器的状态及数据,主要观察两个部分,一个是寄存器的R2,它代表的是存放哪些数组地址的首地址,所以从这里开始读取数据。然后找到地址为0x8040的存储器,可以看到其中存放了数组中的十个数,其顺序和定义时的顺序是一样的,也就是没有顺序。再看第二张图,这是程序执行完以后的寄存器和存储器的状态以及数据,从标红的数据看一看出,这十个数据都发生了变化,第一个是最小的0x00,最后一个是最大的0x0100,这样就将这十个数排序好了。冒泡排序的实现方法有很多种,比如可以先将最大的数推到数组的末尾,也可以将最小的数先拿到数组的前边,两
11、者道理其实都是一样,时间复杂度更是一样,都是O(N2),对于大型的数据来说,最好还是采用快速排序,它的速度是相当快的。2、实验总结:在定义数组的时候最好将其直接定义为十六进制,这样在存储器中观察的时候就非容易,不需要自己进行十进制和十六进制的转化。在代码全速运行前先进行单步的运行,以确定数组开始的地址,这样就能在存储器中找到对应的数据了。统计字符个数一、 实验目的1、学会使用字符串编程,如何在代码中定义字符串,字符串字存储器中占有几个字节,如何将字符串中的每个字符取出来。2、再一次熟悉循环结果,CMP的条件判断,如何执行。二、 实验内容自定义一个字符串,编写代码来统计这个字符串中的字符个数。这
12、里还是采用循环的方法来遍历整个字符串,没遍历一次字符数目加一,然后判断当前是不是0,时0则结束。三、 实验主要步骤1、打开ADS,新建一工程,再新建一个.s的源文件,将其添加到工程中去,开始编写源代码。2、链接、编译源文件,检查语法错误。3、用debug进行调试,观察寄存器的状态,由于此处的数据量较少,因此可以点击单步运行,一直到运行到stop,在此期间观察R1和R2数据的变化,R1代表的是字符数目,R2代表的是当前字符的ASCII码值,当R2的值为0时退出循环。 四、 实验代码AREA symbol,CODE,READONLY ENTRY CODE32STARTLDR R0, =strs M
13、OV R1, #-1 LOOPLDRBR2, R0, #1ADDR1, R1, #1CMPR2, #0BNELOOPSTOPMOVR0, #0x18LDRR1, =20026SWI0x12456 AREA Data, DATA, READWRITEstrsDCBHello, ARM!, 0 END 五、 实验总结与分析1、 实验分析图一是程序运行前的各寄存器和存储器的状态以及数据,可以看到字符串被存储在0x802c开始的地址中,每个字符占一个字节,因此可以知道,在往外读取的时候应该一次读取一个字节,R1的值是字符个数,再运行的时候,每读取一个字符,R1就加一,这样到最后就能统计到这个字符串总的
14、字符个数。图二是程序运行结束时的寄存器的数据,可以看到R1最后统计的字符个数是0x0c,也就是11个,而R2当前的值是0x00,也就是0结束标志,这刚好符合事先给定的字符串“Hello, ARM!”。2、实验总结:实验中比较容易出错的地方就是读取字符串中的每个字符,单个字符在存储器中是以一个字节的ASCII码来存储的,所以每次读取完指针加一就好。合并两个有序数组到第三个数组一、 实验目的1、熟悉掌握比较跳转结构,能在程序中对复杂的跳转结构处理的清晰明朗,设计良好的判断语句。2、深入理解存储器中数组的存放顺序,能够按照程序给定的条件按需取出需要的数据进行处理二、 实验内容已知BUF1中有N1个按
15、从小到大排序的互补相等的字符号,BUF2中有N2个按从小到大排序的互不相等的字符号,将BUF1和BUF2中的数合并到BUF3中按从小到大的顺序排序,且互不相等。三、 实验主要步骤1、打开ADS,新建一工程,再新建一个.s的源文件,将其添加到工程中去,开始编写源代码。2、链接、编译源文件,检查语法错误。3、用debug进行调试,观察寄存器的状态,由于此处的数据量较少,因此可以点击单步运行,一直到运行到stop,在此期间观察R1R10的变化。四、 实验代码AREA symbol,CODE,READONLYENTRYCODE32N1 EQU 10N2 EQU 5N3 EQU 15START LDR
16、R0,=BUF1LDR R1,=BUF2LDR R2,=BUF3MOV R3,#0MOV R4,#0MOV R5,#0LOOPI ADD R6,R0,R3,LSL #2ADD R7,R1,R4,LSL #2ADD R8,R2,R5,LSL #2LDR R9,R6LDR R10,R7CMP R9,R10BLT LOOPJBGT LOOPKBEQ LOOPCMP R5,#N3BEQ STOPLOOPJ STR R9,R8 ADD R3,R3,#1ADD R5,R5,#1ADD R3,R3,#1CMP R3,#N1BLT LOOPI;B LOPILOPI STR R10,R8,#04!ADD R4,
17、R4,#1ADD R5,R5,#1ADD R7,R1,R4,LSL #2LDR R10,R7CMP R4,#N2BLT LOPILOOPK STR R10,R8ADD R4,R4,#1ADD R5,R5,#1CMP R4,#N2BLT LOOPI;B LOPJ LOPJ STR R9,R8,#04!ADD R3,R3,#1ADD R5,R5,#1ADD R6,R0,R3,LSL #2LDR R9,R6CMP R3,#N1BLT LOPJLOOP STR R9,R8ADD R3,R3,#1ADD R4,R4,#1ADD R5,R5,#1CMP R3,#N1BLT LOOPIBEQ LOPICMP
18、 R4,#N2BLT LOOPIBEQ LOPJSTOP MOV R0,#0x18LDR R1,=0X20026SWI 0XAREA Data,DATA,READWRITEBUF1 DCD 0x03, 0x12, 0x20, 0x21, 0x43, 0x50, 0x70, 0x75, 0x90, 0x91BUF2 DCD 0x21, 0x44, 0x45, 0x50, 0x99BUF3 DCD 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 END五、 实验总结与分析1、 实验分析实验中用到了复杂的判断和跳转,其中需要分各种情况进行讨论,比如两个数组中的数据是否都已经存完,或者第三个数组是否存满,来确定下一步需要做什么,在这个程序中处理的不好的地方是当有重复的数据的时候,最后第三个数组不能很好的判断,出现了问题,没有相同数据的情况下可以正常运行。一下两图是运行前后寄存器和存储器数据的对比,可以看出来,除去重复数据,其他都正常运行。2、实验总结:此程序最难得地方就在于如何如何设置条件进行判断,如何进行跳转,每种情况可能会如何出现等等都是需要慎重考虑的问题。专心-专注-专业