您好,欢迎访问三七文档
11实验一ARM汇编基础实验22一、实验目的1.掌握ARM汇编指令2.学习掌握C与汇编混合编程基础3.熟练使用ARM调试工具RVDS进行调试操作33二、实验内容1.熟悉ARM汇编2.用ARM汇编实现1+2+...+N3.C调用汇编实验(实现字符串拷贝功能)4.汇编调用C实验5.ARM汇编实现冒泡算法(选做)44三、预备知识1.ARM汇编、C语言2.RVDS工具55四.实验设备与工具硬件:PC机Pentium100以上软件:Windows操作系统,RVDS软件66五、实验原理ARM中的C和汇编混合编程:1.在汇编中使用C定义的全局变量2.在汇编中调用C的函数3.在C中调用汇编的函数77汇编语言中使用C定义的全局变量1.在汇编中使用C定义的全局变量在汇编和C之间进行一些数据的传递,最简便的办法就是使用全局变量。在汇编中调用C中定义的全局变量,需要在汇编中IMPORT对应的全局变量。IMPORT伪指令用于通知编译器要使用的标号或变量在其他的源文件中定义。例如:汇编文件asmfile.s想调用C文件cfile.c中定义的全局变量a,则在汇编文件asmfile.s前面要添加:IMPORTa88汇编中调用C函数2.在汇编中调用C的函数要在汇编中调用C文件中定义的函数,主要做两方面的工作:首先:需要在汇编中IMPORT对应的C函数名。其次:在调用该C函数之前还需要通过汇编语言传递该函数的参数。C和汇编之间的参数传递是通过ATPCS(ARMThumbProcedureCallStandard)的规定来进行的。简单的说就是如果函数有不多于四个参数,对应的用ARM寄存器R0-R3来进行传递,多于4个时借助栈。函数的返回值通过R0来返回。99/*asmfile*/AREAasmfile,CODE,READONLYIMPORTcFunENTRYMOVR0,#22MOVR1,#11BLcFunMOVR4,R0(函数返回值保存在R0中)END/*Cfile,calledbyasmfile*/intcFun(inta,intb){returna-b;}1010C中调用汇编函数3.在C中调用汇编的函数在C中调用汇编文件中的函数,要做的主要工作有两个:一:是在C中声明函数原型,并加extern关键字;二:是在汇编中用EXPORT导出函数名,并用该函数名作为汇编代码段的标识,最后用movpc,lr返回。然后,就可以在C中使用该函数了。EXPORT伪指令用于在程序中声明一个全局的标号,该标号可在其他的文件中引用。11/*Cfile*/externvoidfun(int*p);声明函数原型intmain(){inti;fun(&i);printf(%d\n,i);return0;}/*ASMFILE*/AREAasmfile,CODE,READONLYEXPORTfun导出函数名funMOVR1,#1STRR1,[R0]MOVPC,LR返回语句ENDC中调用汇编函数12RVDS简单使用介绍13创建新工程点击CodeWarriorforRVDS进入CodeWarriorIDE主窗口,选择File-New进入新建工程/文件选项卡,在选项卡中选择ARMExecutableImage,并在Projectname中输入新建工程的名字,在Location中选择工程文件的存放地址,如图35所示,按下确定后,RVDS将生成用户指定名称的工程。1414图3515添加文件到工程选择File-New进入新建工程/文件选项卡,点击选项卡中的File选项,选择TextFile,在Filename中填写要添加的文件名,在Location中选择源文件的存放目录,并选择AddtoProject选项,接着在下面的Project选项中选择上一步新建的工程,并在Targets选项中选择Debug和Release,具体如图36所示1616图361717设置工程配置选项选择Edit-DebugSettings或是按“ALT+F7”进入工程配置界面,如图37所示图371818设置工程配置选项选择配置界面下的LanguageSetting-RealviewAssembler对RVDS下的汇编器进行配置,主要选择Architecture图381919设置工程配置选项选择配置界面下的LanguageSetting-RealviewCompiler对RVDS下的C编译器进行配置,主要选择Architecture图392020设置工程配置选项选择配置界面下的Linker-RealviewLinker对RVDS下的连接器进行配置,主要配置ROBase,设置生成的可执行程序的下载地址图402121设置工程配置选项选择配置界面下的Debugger-RealviewDebugger对RVDS下的调试器进行配置,主要配置是选择RVD还是ADS环境下的调试器AXD进行调试图412222编译并连接选择Project-Make或是快捷键“F7”对工程中的源文件进行编译并连接,生成带调试信息的可执行文件.axf文件图422323调试选择Project-Debug或是快捷键“F5”启动RVD调试器,并调用生成带调试信息的可执行文件.axf文件图432424RVD调试器界面图44即为进入的RVD调试界面,选择Target-Connecttotarget进入仿真器的选择,如图35所示,选择ARMulator即为选择软件仿真,选择H-JTAG即为选择硬件调试图442525图452626单步调试和运行选择Debug-StepInto或是“F11”即可选择单步运行,可以对源程序进行单步调试,选择Debug-Run或是“F5”选择直接运行该程序。图462727观察寄存器和内存选择View-Registers就可以调用ARM寄存器界面,可以在调试过程中随时查看ARM寄存器的值;选择View-Memory可以调用内存界面,可以在调试过程中随时查看内存中的值。图4728六、实验内容1、运行RVDS,建立工程文件,单步运行演示示例程序(/我的文档/实验一汇编实验/熟悉ARM汇编目录下)深刻理解每一条指令,观察寄存器,内存空间的变化。此处提供六个示例实验:ARM数据处理指令寻址方式实验和ARM内存访问指令寻址方式实验为必做实验。ARM堆栈指针寄存器实验、ARM程序计数器实验、ARM程序状态寄存器实验、ARM工作模式切换实验为选做部分,剩余时间或课后完成此部分选做内容。29寄存器读写实例LDR指令执行前R0存放00000000LDR指令执行后R0存放001000000R030大端模式与小端模式小端模式:CPU对操作数的存放采用低地址存放低字节,高地址存放高字节。大端模式CPU对操作数的存放采用低地址存放高字节,高地址存放低字节。本实验采用小端模式。31写内存,STMIA指令把R1-R3写到R0开始的地址内存读写实例写内存,STMIA指令执行前32寄存器读写实例寄存器赋值前寄存器赋值后双击该位置,输入地址,查看对应地址存储值33把R0(0x210000)开始的6个字读到R1-R5,R7内存读写实例LDMIA指令执行前3434实验一2、用ARM汇编实现1+2+….n的运算。在sum.s文件中,用汇编实现算法核心部分,需添加的代码参考流程图如下:RO=R0+R1R1=R1+1SUM_END结果溢出?R1=NNOYESYESYESNOR0暂存累加和R1自增135353、理解C和汇编,并用汇编程序实现字符串拷贝,并在C程序中调用该汇编程序。在汇编文件testfile1.s中添加两行汇编代码,分别实现:拷贝源字符串的一个字节到R2中将拷贝的字节复制到目标空间注意事项:1.C文件和汇编文件都必须加到工程中去,否则编译会报错。2.C文件和汇编文件要拷贝到工程目录下。实验二36364、在汇编中调用C函数。在汇编文件testfile2.s中相应位置添加汇编代码,通过调用c函数g()实现1+2+3+glovb1,结果存在R8中。实验三37375、用ARM汇编实现冒泡算法。(选做)这种方法的基本思想:是将待排序的元素看作是竖着排列的“气泡”,较大的元素比较重,从而要往下沉。在冒泡排序算法中我们要对这个“气泡”序列处理若干遍。所谓一遍处理,就是自上向下检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。如果发现两个相邻元素的顺序不对,即“轻”的元素在下面,就交换它们的位置。显然,处理一遍之后,“最重”的元素就沉到了最低位置;处理二遍之后,“次重”的元素就沉到了次低位置。在作第二遍处理时,由于最低位置上的元素已是“最重”元素,所以不必检查。一般地,第i遍处理时,不必检查第i低位置以下的元素,因为经过前面i-1遍的处理,它们已正确地排好序。实验四(选做)38冒泡排序算法流程图(参考)-----较小的数值排放到后面3939七、思考题1、add替换成adds,sub替换成subs有什么影响。2、mov替换成movne有什么影响?3、STMIA换成STMIB,STMIA换成STMDA有什么区别。4、思考用ARM汇编实现1+3+5+….+(2n+1)或者2+4+6+…..+2n。5、实验4中如果去除汇编代码中的“EXPORTstrcopy”会有什么现象,为什么?6、实验5中如果去除汇编代码中的“IMPORT…..”会有什么现象,为什么?
本文标题:微机原理第一次实验
链接地址:https://www.777doc.com/doc-4007036 .html