ARM汇编实验报告
- 格式:docx
- 大小:2.44 MB
- 文档页数:19
汇编语言与接口技术实验报告ARM汇编语言程序设计院系信科院专业班级计科1201学生姓名学号指导教师提交日期 2015 年 5 月 15 日一、实验目的●初步学会使用IAR EWARM 开发环境及ARM 软件模拟器。
●通过实验掌握简单ARM 汇编指令的使用方法。
●通过实验掌握使用ldm/stm、b、bl 等指令完成较为复杂的存储区访问和程序分支,学习使用条件码,加强对CPSR 的认识。
●通过实验掌握 ARM 处理器16 位Thumb 汇编指令的使用方法。
二、实验内容●利用实验参考程序学习使用ldr/str、mov 等指令访问寄存器或存储单元。
使用add/sub/lsl/lsr/and/orr 等指令,完成基本数学/逻辑运算。
●编写程序循环对R4~R11 进行累加8 次赋值,R4~R11 起始值为1~8,每次加操作后把R4~R11 的内容放入SP 栈中,SP 初始设置为0x800。
最后把R4~R11 用LDMFD 指令清空赋值为0。
●新建工程,并自行编写汇编程序,分别使用ldr、str、ldmia、stmia 操作,实现对某段连续存储单元写入数据,并观察操作结果。
学习分支程序设计,要求判断参数,根据不同参数,调用不同的子程序。
●编写程序实现50!(即50的阶乘)。
●编写程序从ARM状态切换到Thumb,在ARM 状态下把R2 赋值为0x12345678,在Thumb状态下把R2 赋值为0x87654321。
同时观察并记录CPSR、SPSR 的值,分析各个标志位。
三、实验设备1. UP-TECH S2410实验平台,ARM标准/增强型仿真器套件2. PC 操作系统WIN98 或WIN2000 或WINXP,IAR EWARM集成开发环境,仿真调试驱动程序(H-JTAG)。
四、实验参考程序#*********************************************************************************************# NAME: ARMcode1.s *# Author: Embest *# Desc: ARMcode examples *# copy words from src to dst *# History: shw.He 2005.02.22 *#*********************************************************************************************NAME mainPUBLIC __iar_program_startSECTION `.text`:CODE:NOROOT(2)ARM ; ARM mode__iar_program_startmain:ldr r0, =src /* r0 = pointer to source block */ldr r1, =dst /* r1 = pointer to destination block */mov r2, #num /* r2 = number of words to copy */mov sp, #0x400 /* set up stack pointer (r13) */blockcopymovs r3,r2, LSR #3 /* number of eight word multiples */beq copywords /* less than eight words to move ? */stmfd sp!, {r4-r11} /* save some working registers */octcopyldmia r0!, {r4-r11} /* load 8 words from the source */stmia r1!, {r4-r11} /* and put them at the destination */subs r3, r3, #1 /* decrement the counter */bne octcopy /* ... copy more */ldmfd sp!, {r4-r11} /* don't need these now - restore originals */ copywordsands r2, r2, #7 /* number of odd words to copy */beq stop /* No words left to copy ? */ wordcopyldr r3, [r0], #4 /* a word from the source */str r3, [r1], #4 /* store a word to the destination */subs r2, r2, #1 /* decrement the counter */bne wordcopy /* ... copy more */stopb stopALIGNsrcDCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4dstDCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0END五、程序运行测试实验代码(替换参考程序的main部分)及测试结果如下:实验1LDR R0, =SRCLDR R1,=DSTMOV R2,#55MOV SP,#0x400BLOCKCOPYMOVS R3,R2, LSR #3BEQ COPYWORDSSTMFD SP!, {R4-R11}OCTCOPYLDMIA R0!, {R4-R11}STMIA R1!, {R4-R11}SUBS R3, R3, #1BNE OCTCOPYLDMFD SP!, {R4-R11}COPYWORDSANDS R2, R2, #7BEQ STOPWORDCOPYLDR R3, [R0], #4STR R3, [R1],#4SUBS R2, R2, #1BNE WORDCOPYSTOPB STOPALIGNSRCDCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4DSTDCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0END实验2STARTldr r0,=SRCmov r2,#8mov sp,#0x800mov r4,#1mov r5,#2mov r6,#3mov r7,#4mov r8,#5mov r9,#6mov r10,#7mov r11,#8LOOPadd r4,r4,#1add r5,r5,#1add r6,r6,#1add r7,r7,#1add r8,r8,#1add r9,r9,#1add r10,r10,#1add r11,r11,#1stmfd sp!,{r4-r11}subs r2,r2,#1bne LOOPLDMIA r0!,{r4-r11}STOPLTORGSRCDCD 0,0,0,0,0,0,0,0 exit: B exitEND实验3main:STARTmov r0,#0x3000mov r1,#0x10000001mov r2,#100LOOPstr r1,[r0],#4add r1,r1,#1subs r2,r2,#1bne LOOPmov r0,#0x3000mov r2,#100mov r9,#0LOOP1ldr r1,[r0],#4adds r8,r1,r8adc r9,r9,#0subs r2,r2,#1bne LOOP1STOPb STOPEND实验4STARTmov r8,#20mov r9,#0sub r0,r8,#1LOOPmov r1,r9umull r8,r9,r0,r8mla r9,r1,r0,r9subs r0,r0,#1bne LOOPEND实验5STARTldr r2,=0x12345678CODE16ldr r2,=0x87654321END。
基于arm的汇编实验报告竭诚为您提供优质文档/双击可除基于arm的汇编实验报告篇一:汇编实验报告实验一(1)熟悉汇编语言程序调试环境及顺序程序设计一、实验目的及要求:1.学习及掌握汇编语言源程序的书写格式和要求,明确程序中各段的功能和相互之间的关系。
2.学会使用eDIT、mAsm、LInK、Debug等软件工具。
3.熟练掌握在计算机上建立、汇编、连接、调试及运行程序的方法。
二、熟悉汇编语言程序调试环境1.汇编语言源程序的建立本例中给出的程序是要求从内存中存放的10个无符号字节整数数组中找出最小数,将其值保存在AL寄存器中。
设定源程序的文件名为Abc。
DATAsegmenTbuFDb23h,16h,08h,20h,64h,8Ah,91h,35h,2bh,7FhcneQu$-buF DATAenDs coDesegmenT Assumecs:coDe,Ds:DATA sTART:pushDsxoRAx,AxpushAxmoVAx,DATAmoVDs,AxmoVbx,oFFseTbuF moVcx,cnDeccxmoVAL,[bx]IncbxLp:cmpAL,[bx] JbenexTmoVAL,[bx]nexT:IncbxDeccxJnZLpmoVAh,4chInT21hcoDeenDsenDsTART键入以下命令:c:\>eDITAbc.Asm此时屏幕的显示状态如图1所示。
1图1用eDIT编辑Abc.Asm程序窗口程序输入完毕后一定要将源程序文件存入盘中,以便进行汇编及连接,也可以再次调出源程序进行修改。
2.将源程序文件汇编成目标程序文件一般情况下,mAsm汇编程序的主要功能有以下3点:(1)检查源程序中存在的语法错误,并给出错误信息。
(2)源程序经汇编后没有错误,则产生目标程序文件,扩展名为.obJ。
(3)若程序中使用了宏指令,则汇编程序将展开宏指令。
源程序建立以后,在Dos状态下,采用宏汇编程序mAsm 对源程序文件进行汇编,其操作过程如图2所示。
实验一ARM 汇编指令实验目的:学会使用Embest IDE for ARM开发环境及ARM软件模拟器;通过实验掌握简单ARM汇编指令的使用方法。
一.实验内容:熟悉开发环境的使用并使用 ldr/str/mov 等指令访问寄存器或存储单元。
使用 add/sub/lsl/lsr/and/orr 等指令,完成基本数学/逻辑运算。
二.实验原理:1.ARM通用寄存器ARM7处理器共有37个寄存器:31 个通用寄存器和6个状态寄存器。
(1)31个通用32位寄存器,其中包括程序计数器(PC,即R15)。
通用寄存器(R0~R15)可以分为3 类:1)不分组寄存器R0~R7;所有的处理器模式下访问的都是同一个物理寄存器,即在所有处理器模式下,它们每一个都访问一样的32 位寄存器。
它们是真正的通用寄存器,没有体系结构所隐含的特殊用途。
2)分组寄存器R8~R14;快速中断模式拥有独立的一组分组寄存器R8~R12,其余模式共用一组分组寄存器R8~R12;而所有模式都拥有独立的分组寄存器R13、R14。
3)程序计数器R15;寄存器 R15 用做程序计数器 (PC)。
(2)6个32位状态寄存器,但是ARM7只是使用了其中的12位。
程序状态寄存器CPSR是各种模式下通用的状态寄存器,而各种异常模式都有自己的备份状态寄存器SPSR,分别为SPSR_abt、SPSR_ svc、 SPSR_und、SPSR_irq、SPSR_fiq。
2.存储器格式ARM体系结构将存储器看作是从零地址开始的字节的线性组合。
字节零到字节三放置第一个字(WORD),字节四到字节七存储第二个字,以此类推。
ARM体系结构可以用两种方法存储字数据,分别称为大端格式和小端格式。
(1)小端格式字数据的高位字节存储在高地址中,而字数据的低位字节则存放在低地址中。
高地址 31 23 22 16 15 8 7 0 字地址84低地址0(2)大端格式字数据的高位字节存储在低地址中,而字数据的低位字节则存放在高地址中。
ARM汇编实验报告一、实验目的本次实验旨在通过编写ARM汇编程序,加深对ARM架构和指令集的理解,并掌握ARM汇编程序的设计和调试技巧。
二、实验内容本次实验分为两个部分,分别是基础部分和进阶部分。
1.基础部分基础部分要求编写一个ARM汇编程序,实现输入一个整数n,并输出从1到n的所有奇数的和。
具体要求如下:(1)使用汇编语言实现。
(2)使用r0寄存器保存输入的整数n。
(3)使用r1和r2寄存器保存计算中的临时变量。
(4)使用r3寄存器保存输出的结果。
(5)使用ldr指令从内存中加载数据,str指令将数据保存到内存中。
(6)使用循环实现计算。
(7)使用swi指令终止程序。
2.进阶部分进阶部分要求实现一个排序算法,将从键盘输入的n个整数进行排序,并输出排序后的结果。
具体要求如下:(1)使用汇编语言实现。
(2)使用r0寄存器保存排序的整数个数n。
(3)使用r1寄存器保存指向数组的指针。
(4)使用r2和r3寄存器保存计算中的临时变量。
(5)使用ldr指令从内存中加载数据,str指令将数据保存到内存中。
(6)使用循环实现排序算法。
(7)使用swi指令终止程序。
三、实验步骤1.基础部分实现:(1)将输入的整数n保存到r0寄存器中。
(2)初始化r1和r3寄存器,将计算所需的临时变量置为0。
(3)使用ldr指令读取r0寄存器的值到r2寄存器。
(4)使用循环实现奇数求和的计算,将结果保存到r3寄存器。
(5)使用str指令将r3寄存器的值保存到内存中。
(6)使用swi指令终止程序。
2.进阶部分实现:(1)将输入的整数n保存到r0寄存器中。
(2)使用ldr指令将数组的首地址保存到r1寄存器。
(3)使用循环结构实现排序算法。
(4)使用str指令将排序后的结果保存到内存中。
(5)使用swi指令终止程序。
四、实验结果经过编写和调试,基础部分程序可以正确输入整数n,并输出从1到n的所有奇数的和。
进阶部分程序可以正确输入整数n,并对输入的n个整数进行排序,并输出排序后的结果。
《嵌入式系统原理与应用B》课程实验报告ARM汇编语言编程与调试要求完成的主要实验1、给出的数据中寻找最大、最小数问题2、两种求和运算的编程与调试3、第四章作业第9题4、排序冒泡程序的调试与总结5、第四章作业第11题说明:标注完成的实验,未完成的给予说明专业名称:通信工程班级:1510班学生姓名:石龙飞学号(8位):03151307指导教师:刘钊远给出的数据中寻找最大、最小数问题一、实验目的1、学习汇编软件的安装、使用,熟悉汇编环境。
2、学会使用汇编软件,如何新建一个工程,如何书写源代码,如何进行链接、编译,以及如何调试。
3、尝试一些简单的指令,学会用汇编指令写一些简单的程序。
二、实验内容编写一个汇编程序,要求在给定的一组数中找到最大数和最小数。
三、实验主要步骤1、首先建立一个工程2、再新建.s的源文件,添加到工程中3、编写源代码,这里主要是实现在一组数中寻找最大数和最小数,最后将找到的两个数放到相应的寄存器中。
4、进行链接编译,看看有没有语法的错误,如果有错误编译器会提示错误的类型以及在哪里出错。
5、进行debug调试,查找代码中的逻辑错误,若无逻辑错误,可在debug界面查看运行结果,其最需要的关注的几个地方是菜单栏的一组运行按钮、源码执行的步骤以及断点、左边的寄存器状态、下方的存储器状态,将这些综合起来,就可以很明确的回到程序如何运行,运行结果如何。
四、实验代码五、实验总结与分析1、实验结果分析其中用红色方框框起来的是最后程序运行的结果,也就是在R3中保存了最小数在R2中保存了最大数,完成了实验要求。
2、在用汇编语言编程之前首先要看看有没有汇编软件ADS、没有的话需要安装,Windows XP安装起来比较简单,只需要点击setup,一直点击写一部就可以,但是如果是Windows 7或者更高版本的话就需要在setup的属性里点击兼容Windows XP,运行时以管理员身份运行才能正确进行安装。
大连理工大学软件学院《嵌入式系统原理与设计》实验报告(每组一份,打印)姓名:刘华一学号:201492405 班级:软1411姓名:李军学号:201493076 班级:软日1401实验时间:16年9月30日实验室:嵌入式实验室指导教师:邱铁成绩:实验一:ARM汇编指令一、实验目的和要求1. 熟悉ARM Developer Suite v1.2集成开发环境2.ARM汇编语言指令功能训练二、实验原理和内容RAM是32位体系结构,每个内存单元是32位的,对于64位的数需要两个字才能存储。
题目:熟悉ARM Developer Suite v1.2集成开发环境逐条试验ARM汇编语言指令功能,并观寄存器\存储器的变化三、主要仪器设备及软件编程环境硬件:PC机软件:ARM Developer Suite v1.2集成开发环境,Windows 98/2000/NT/XP四、实验步骤与编程1.打开软件ARM Developer Suite v1.2,选择file中的新建,在project中选择第一个,输入project name2.在同一个界面选择file,建立一个.s文件,打开此文件后就可以在里面进行编写汇编指令3.输入示例代码后,在原有的project对话框中鼠标右键连接到你所建的工程文件下的.s文件,再点击编译。
4.在新弹出的界面中,打开左边的寄存器列表,再点击单步调试,就可以看到每条指令执行时相应寄存器的变化以及相应要执行的下一条指令。
五、实验数据与结果分析数据传送类指令:算数运算类指令:逻辑运算类指令:比较指令:乘法指令:六、讨论、建议由于对于软件尚未熟悉,且windows系统兼容性原因,在开始配置阶段浪费了较多时间,由于时间有限,只是大体练习了一遍,在批量读取及存储方面仍存在较大问题,需要回去后勤加练习。
5_ARM实验报告
实验名称:ARM处理器实验报告
实验目的:通过实验掌握ARM处理器的基本结构和工作原理,了解ARM指令的执行过程以及汇编语言编程的基本方法。
实验设备:ARM处理器开发板、电脑、开发软件Keil等。
实验步骤:
1. 准备工作:连接ARM开发板和电脑,打开Keil软件,新建一个工程。
2. 编写程序:在Keil软件中编写一个简单的程序,比如将两个数相加并将结果输出。
3. 编译程序:通过Keil软件进行编译,生成可执行文件。
5.调试程序:在ARM开发板上运行程序,并观察程序的运行结果。
6.分析程序:分析程序的运行过程,了解ARM指令的执行过程和程序的运行逻辑。
实验结果:
通过本次实验,我对ARM处理器的基本结构和工作原理有了更深入的了解。
我了解了ARM指令的执行过程,掌握了汇编语言编程的基本方法。
在实验中,我成功编写了一个简单的程序,并在ARM开发板上成功运行并输出了结果。
总结与反思:
通过本次实验,我对ARM处理器有了更深入的了解,对汇编语言编程也有了更多的实践经验。
我发现在编写程序时需要考虑指令的执行顺序和逻辑关系,需要注意程序的优化和逻辑性。
在今后的学习和工作中,我将继续深入学习ARM处理器的原理和应用,不断提高自己的编程技能和实践能力。
结论:
本次实验让我在实践中掌握了ARM处理器的基本原理和工作方法,提高了自己的实践能力和编程技能。
我将继续学习和实践,不断提高自己在ARM处理器领域的水平,为将来的工作和研究打下坚实的基础。
实验步骤和结果:
(1)打开Keil uVision,在“Project”—>“New uVision Project”新建一个名为41的工程并为其选择ARM芯片,如下图:
(2)在新建的工程里新建一个名为a.s的文件,在“Project workpace”将文件导入工程中,如下图
(3)在a.s文件里输入如下汇编代码:
AREA EX4_41,CODE,READONLY
ENTRY
CODE32
START LDR R0,=0x90010;变量X的地址送入R0
LDR R1,[R0],#4 ;变量X的值读入R1
LDR R2,[R0],#4 ;变量Y的值读入R1
ADD R1,R1,R2 ;X+Y结果存入R1
STR R1,[R0] ;结果存入Z中
B START
END
(4)在“project”—>“Options for Target”Target1””—>“Target”做相应设置;,结果如下图:
分配只读内存范围
去掉最上面的勾
在“Debug”选项添加“Debug.ini”文件
(5)编译运行代码,并调试代码,寄存器地址变化结果如下图:
(6)控制台地址栏输入地址查看。
arm汇编语言编程实验报告实验二ARM汇编语言编程实验.doc班级计算机科学与技术(嵌入式)学号课程名称ARM体系结构姓名实验成绩日期指导教师冯灵霞实验报告院系信息工程学院一、实验目的1、掌握ADT IDEARM开发环境中基本的工程设置以及程序编译方法。
2、掌握ADT IDEARM开发环境中基本的程序调试方法。
3、掌握基本的ARM汇编语言编程方法。
二、实验内容用汇编语言编写一个程序实现如下目的:从源地址拷贝num个字(num*4个字节)的数据到目的地址dst中。
三、预备知识1、ARM汇编语言的基础知识。
2、程序调试的基础知识和方法。
四、实验设备1、硬件:JXARM9-2440教学实验箱、PC机。
2、软件:PC机操作系统Windows 98(2000、XP)+ADT IDE开发环境。
五、基础知识ADT IDE集成了GNU汇编器arm-elf-as、编译器arm-elf-gcc和链接器arm-elf-ld。
在ADT IDE中编写的程序必须符合GNU的语法规则。
下面介绍一些基本的GNU汇编知识以及本实验用到的ARM 汇编指令。
1、GUN汇编语言语法及规则1)_start_start为程序默认入口点,代码段默认起始地址为0x800,如果需要修改可以在链接脚本文件中指定。
2)标号语法:symbol:symbol为定义的符号。
说明:上述代码定义一个标号,它表示程序中当前的指令或数据地址。
如果在程序中出现两个相同的标号,汇编器将会产生一个警告,且只有第一个标号有效。
2、GNU汇编语言伪操作1).equ伪操作语法:.equ symbol,exprexpr为基于寄存器的地址值、程序中的标号、32位的地址常量或位的常量。
symbol为.equ伪操作为expr定义的字符名称。
说明:该操作符为数字常量、基于寄存器的值和程序中的标号定义一个字符名称,相当于C语言中的宏定义。
示例:.equ USERMODE,0x102).global伪操作符语法:.global symbolsymbol为声明的符号的名称。
ARM汇编实验报告《嵌入式系统原理与应用B》课程实验报告ARM汇编语言编程与调试要求完成的主要实验1、给出的数据中寻找最大、最小数问题2、两种求和运算的编程与调试3、第四章作业第9题4、排序冒泡程序的调试与总结5、第四章作业第11题说明:标注完成的实验,未完成的给予说明专业名称:通信工程班级:1510班学生姓名:石龙飞学号(8位):03151307指导教师:刘钊远4、进行链接编译,看看有没有语法的错误,如果有错误编译器会提示错误的类型以及在哪里出错。
5、进行debug调试,查找代码中的逻辑错误,若无逻辑错误,可在debug界面查看运行结果,其最需要的关注的几个地方是菜单栏的一组运行按钮、源码执行的步骤以及断点、左边的寄存器状态、下方的存储器状态,将这些综合起来,就可以很明确的回到程序如何运行,运行结果如何。
一、实验代码AREA symbol,CODE,READONLY ENTRYCODE32STARTLDR R0, =numsMOV R2, #1INITNUMSSTR R2, [R0], #4ADD R2, R2, #2CMP R2, #101BNE INITNUMSLDR R0, =numsLDR R2, [R0]LDR R3, [R0]MOV R1, #1FINDMAXMINLDR R4, [R0], #4CMP R2, R4MOVCC R2, R4CMP R3, R4MOVCS R3, R4ADD R1, R1, #1CMP R1, #101BNE FINDMAXMINSTOPb STOPAREA Data, DATA, READWRITEnums SPACE 100END二、实验总结与分析1、实验结果分析其中用红色方框框起来的是最后程序运行的结果,也就是在R3中保存了最小数在R2中保存了最大数,完成了实验要求。
2、在用汇编语言编程之前首先要看看有没有汇编软件ADS、没有的话需要安装,Windows XP安装起来比较简单,只需要点击setup,一直点击写一部就可以,但是如果是Windows 7或者更高版本的话就需要在setup的属性里点击兼容Windows XP,运行时以管理员身份运行才能正确进行安装。
两种求和运算的编程与调试一、实验目的1、掌握循环的使用技巧,主要确定循环的上下界,以及循环体里需要执行的代码,防止一些越界的操作。
2、尝试不同的求和运算的算法。
二、实验内容给定一个正整数,求从零到这个数的所有整数的和。
简单得对问题进行分析可知,这个功能能过用两种方式实现,一种是循环,一种是直接用求和公式计算出来,如果从算法的时间复杂度来说,那肯定是后者时间复杂度低,只有O (1),但是从学习的角度,还是要练习一下循环结构,因此,这里主要用循环语句实现,以研究其中的问题。
三、实验主要步骤1、打开ADS,新建一工程,再新建一个.s的源文件,将其添加到工程中去,开始编写源代码。
2、链接、编译源文件,检查语法错误3、用debug进行调试,观察寄存器的状态,在stop前打断点,全速运行代码,这样就可以在代码最后天下来,查看运行结果。
四、实验代码AREA symbol,CODE,READONLY ENTRYCODE32STARTLDR R0, =sumMOV R1, #100MOV R2, #0MOV R3, #0LOOPADD R2, R2, #1ADD R3, R3, R2SUB R1, R1, #1CMP R1, #0BNE LOOPSTRCS R3, [R0]STOPMOV R0, #0x18LDR R1, =0x20026AREA Data, DATA, READWRITE sum DCD 0END五、实验总结与分析1、实验结果分析用红色框圈起来的是最后执行的结果,也就是将最后0~100的和放在了R3中,是0x13BA,二这个程序采用的是循环的方式求1~100的和,所以最后一个数字是100,正是R2中的0x64。
2、实验总结:因为这个程序里用到了循环语句,所以就有几个点需要注意,也就是循环的上下界和循环体力边的语句。
在代码实现中,将R1寄存器的值置为100,然后再循环体里每次减一,然后和0进行比较,大于零的话继续,小于等于零的话就跳出循环。
这里容易出错的地方就是最后到底是和谁比较或者R1的初值给多少合适。
再循环体里主要做了两件事,R2从零开始每次加一,而R3就是截止目前所有数的和。
排序冒泡程序的调试与总结一、实验目的1、更加深入理循环程序设计,注意循环嵌套中的一些问题,比如条件判断、步长、两层循环中间的代码设计。
2、深入学习掌握debug调试的使用技巧,以及存储器窗口数据的观察,在存储器中找到代码需要的地址。
3、学会如何遍历存储在存储器中的数据,将其读入寄存器进行处理。
二、实验内容利用冒泡排序将给定的一组数进行排序,这里采用升序,在排序完和排序后查看存储器的状态,检查排序是否成功。
三、实验主要步骤1、打开ADS,新建一工程,再新建一个.s的源文件,将其添加到工程中去,开始编写源代码。
2、链接、编译源文件,检查语法错误。
3、用debug进行调试,观察寄存器的状态,在stop前打断点,全速运行代码,这样就可以在代码最后天下来,查看运行结果。
四、实验代码AREA symbol,CODE,READONLYENTRYCODE32STARTMOV R0, #0FOR1LDR R2, =numsMOV R1, #0FOR2LDR R3, [R2]LDR R4, [R2, #4]CMP R3, R4LDRGT R5, [R2, #4]STRGT R3, [R2, #4]STRGT R5, [R2]ADD R2, R2, #4ADD R1, R1, #1CMP R1, #9BCC FOR2ADD R0, R0, #1CMP R0, #9BCC FOR1AREA Data, DATA, READWRITEnums DCD 12, 3, 45, 1, 44, 100, 0, 12, 10, 3END五、实验总结与分析1、实验分析第一张图为排序前寄存器以及存储器的状态及数据,主要观察两个部分,一个是寄存器的R2,它代表的是存放哪些数组地址的首地址,所以从这里开始读取数据。
然后找到地址为0x8040的存储器,可以看到其中存放了数组中的十个数,其顺序和定义时的顺序是一样的,也就是没有顺序。
再看第二张图,这是程序执行完以后的寄存器和存储器的状态以及数据,从标红的数据看一看出,这十个数据都发生了变化,第一个是最小的0x00,最后一个是最大的0x0100,这样就将这十个数排序好了。
冒泡排序的实现方法有很多种,比如可以先将最大的数推到数组的末尾,也可以将最小的数先拿到数组的前边,两者道理其实都是一样,时间复杂度更是一样,都是O(N2),对于大型的数据来说,最好还是采用快速排序,它的速度是相当快的。
2、实验总结:在定义数组的时候最好将其直接定义为十六进制,这样在存储器中观察的时候就非容易,不需要自己进行十进制和十六进制的转化。
在代码全速运行前先进行单步的运行,以确定数组开始的地址,这样就能在存储器中找到对应的数据了。
统计字符个数一、实验目的1、学会使用字符串编程,如何在代码中定义字符串,字符串字存储器中占有几个字节,如何将字符串中的每个字符取出来。
2、再一次熟悉循环结果,CMP的条件判断,如何执行。
二、实验内容自定义一个字符串,编写代码来统计这个字符串中的字符个数。
这里还是采用循环的方法来遍历整个字符串,没遍历一次字符数目加一,然后判断当前是不是0,时0则结束。
三、实验主要步骤1、打开ADS,新建一工程,再新建一个.s的源文件,将其添加到工程中去,开始编写源代码。
2、链接、编译源文件,检查语法错误。
3、用debug进行调试,观察寄存器的状态,由于此处的数据量较少,因此可以点击单步运行,一直到运行到stop,在此期间观察R1和R2数据的变化,R1代表的是字符数目,R2代表的是当前字符的ASCII码值,当R2的值为0时退出循环。
四、实验代码AREA symbol,CODE,READONLYENTRYCODE32STARTLDR R0, =strsMOV R1, #-1LOOPLDRB R2, [R0], #1ADD R1, R1, #1CMP R2, #0BNE LOOPSTOPMOV R0, #0x18LDR R1, =20026SWI 0x12456AREA Data, DATA, READWRITEstrs DCB "Hello, ARM!", 0END五、实验总结与分析1、实验分析图一是程序运行前的各寄存器和存储器的状态以及数据,可以看到字符串被存储在0x802c开始的地址中,每个字符占一个字节,因此可以知道,在往外读取的时候应该一次读取一个字节,R1的值是字符个数,再运行的时候,每读取一个字符,R1就加一,这样到最后就能统计到这个字符串总的字符个数。
图二是程序运行结束时的寄存器的数据,可以看到R1最后统计的字符个数是0x0c,也就是11个,而R2当前的值是0x00,也就是0结束标志,这刚好符合事先给定的字符串“Hello, ARM!”。
2、实验总结:实验中比较容易出错的地方就是读取字符串中的每个字符,单个字符在存储器中是以一个字节的ASCII 码来存储的,所以每次读取完指针加一就好。
合并两个有序数组到第三个数组一、实验目的1、熟悉掌握比较跳转结构,能在程序中对复杂的跳转结构处理的清晰明朗,设计良好的判断语句。
2、深入理解存储器中数组的存放顺序,能够按照程序给定的条件按需取出需要的数据进行处理二、实验内容已知BUF1中有N1个按从小到大排序的互补相等的字符号,BUF2中有N2个按从小到大排序的互不相等的字符号,将BUF1和BUF2中的数合并到BUF3中按从小到大的顺序排序,且互不相等。
三、实验主要步骤1、打开ADS,新建一工程,再新建一个.s的源文件,将其添加到工程中去,开始编写源代码。
2、链接、编译源文件,检查语法错误。
3、用debug进行调试,观察寄存器的状态,由于此处的数据量较少,因此可以点击单步运行,一直到运行到stop,在此期间观察R1~R10的变化。
四、实验代码AREA symbol,CODE,READONLYENTRYCODE32N1 EQU 10N2 EQU 5N3 EQU 15START LDR R0,=BUF1LDR R1,=BUF2LDR R2,=BUF3MOV R3,#0MOV R4,#0MOV R5,#0LOOPIADD R6,R0,R3,LSL #2ADD R7,R1,R4,LSL #2ADD R8,R2,R5,LSL #2LDR R9,[R6]LDR R10,[R7]CMP R9,R10BLT LOOPJBGT LOOPKBEQ LOOPCMP R5,#N3BEQ STOPLOOPJSTR R9,[R8]ADD R3,R3,#1ADD R5,R5,#1ADD R3,R3,#1CMP R3,#N1BLT LOOPI;B LOPILOPISTR R10,[R8,#04]!ADD R4,R4,#1ADD R5,R5,#1ADD R7,R1,R4,LSL #2LDR R10,[R7]CMP R4,#N2BLT LOPILOOPKSTR R10,[R8]ADD R4,R4,#1ADD R5,R5,#1CMP R4,#N2BLT LOOPI;B LOPJLOPJSTR R9,[R8,#04]!ADD R3,R3,#1ADD R5,R5,#1ADD R6,R0,R3,LSL #2LDR R9,[R6]CMP R3,#N1BLT LOPJLOOPSTR R9,[R8]ADD R3,R3,#1ADD R4,R4,#1ADD R5,R5,#1CMP R3,#N1BLT LOOPIBEQ LOPICMP R4,#N2BLT LOOPIBEQ LOPJSTOPMOV R0,#0x18LDR R1,=0X20026SWI 0X123456AREA Data,DATA,READWRITEBUF1 DCD 0x03, 0x12, 0x20, 0x21, 0x43, 0x50, 0x70, 0x75, 0x90, 0x91 BUF2 DCD 0x21, 0x44, 0x45, 0x50, 0x99BUF3 DCD 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00END五、实验总结与分析1、实验分析实验中用到了复杂的判断和跳转,其中需要分各种情况进行讨论,比如两个数组中的数据是否都已经存完,或者第三个数组是否存满,来确定下一步需要做什么,在这个程序中处理的不好的地方是当有重复的数据的时候,最后第三个数组不能很好的判断,出现了问题,没有相同数据的情况下可以正常运行。