嵌入式系统原理与应用 第3版 实验指导书 实验汇总1-15:汇编指令-ARM C指针_第1页
嵌入式系统原理与应用 第3版 实验指导书 实验汇总1-15:汇编指令-ARM C指针_第2页
嵌入式系统原理与应用 第3版 实验指导书 实验汇总1-15:汇编指令-ARM C指针_第3页
嵌入式系统原理与应用 第3版 实验指导书 实验汇总1-15:汇编指令-ARM C指针_第4页
嵌入式系统原理与应用 第3版 实验指导书 实验汇总1-15:汇编指令-ARM C指针_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验一:熟悉开发环境与汇编编程实验11实验目的熟悉ADS1.2软件开发环境;掌握ARM920T汇编指令的用法,并能编写简单的汇编程序;掌握指令的条件执行和使用LDR/STR指令完成存储器的访问。2实验内容(1)使用LDR指令读取0x30003100上的数据,将数据加1,若结果小于10,则使用STR指令把结果写回原地址,若结果大于等于10,则把0写回原地址。(2)使用ADS1.2软件仿真,单步,全速运行程序,设置断点,打开寄存器窗口(ProcessorRegisters)监视R0,R1的值,打开存储器观察窗口(Memory)监视0x30003100上的值。3预备知识(1)ARM指令系统内容;(2)ADS1.2工程编辑、编译器和AXD调试器的内容。4实验设备硬件:PC机一台。软件:Windows98/XP/2000系统,ADS1.2集成开发环境。5实验步骤(1)启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程arm1.mcp。输入工程名称,选择存放路径,确定。(2)新建工程源文件,输入文件名如arm1.s,选择添加到工程中选项,在Targets中选择DebugRel选项,确定,进入代码编写窗口编写实验程序,最后保存。(3)进行DebugRelSettings设置。在LanguageSettings中,将ARM汇编编译器、C语言编译器、C++语言编译器、Thumb汇编编译器、ThumbC语言编译器的Target选项Processor全部选择ARM920T处理器。(4)设置工程连接Linker地址ROBase为0x30000000,RWBase为0x30003000,设置调试口地址Imageentrypoint为0x30000000。(5)编译连接工程正确后,选择Project|Debug,启动AXD进入调试环境,在菜单Options中选择ConfigureTarget,进入ChooseTarget,选择ARMulate.dll后,单击Configure按钮,选择ARM920微处理器,单击OK按钮退出。这时就为软件仿真做好了准备工作,进行调试。(6)打开寄存器窗口(ProcessorRegisters),选择Current项监视R0,R1的值。打开存储器观察窗口(Memory),设置观察地址为0x30003100,显示方式Size为32Bit,监视0x30003100地址上的值。(7)可以F10单步运行程序,可以设置/取消断点,或者全速运行程序,停止程序运行。这时观察寄存器和0x30003100地址上的值。6、实验报告内容叙述ADS1.2集成开发环境的组成。叙述主要调试窗口和作用。7参考程序:COUNTEQU0x30003100 AREAExample111,CODE,READONLY ENTRY CODE32STARTLDRR1,=COUNT MOVR0,#0 STRR0,[R1]LOOPLDRR1,=COUNTLDRR0,[R1]ADDR0,R0,#1CMPR0,#10MOVHSR0,#0STRR0,[R1]BLOOPEND 实验二汇编指令实验21实验目的(1)掌握ARM乘法指令的使用方法;(2)了解子程序编写及调用。2实验内容(1)使用STMFD/LDMFD,MUL指令编写一个整数乘方的子程序,然后使用BL指令调用子程序计算Xn的值。(2)使用ADS1.2软件仿真,单步,全速运行程序,设置断点,打开寄存器窗口(ProcessorRegisters)监视R0,R1的值,打开存储器观察窗口(Memory)监视0x30003000上的值。3预备知识(1)ARM指令系统内容;(2)ADS1.2工程编辑和AXD调试的内容。4实验设备硬件:PC机一台。软件:Windows98/XP/2000系统,ADS1.2集成开发环境。5实验步骤(1).启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程arm2.mcp。(2).建立汇编源文件arm2.s,编写实验程序,然后添加到工程中。(3).设置工程连接地址ROBase为0x30000000,RWBase为0x30003000,设置调试口地址Imageentrypoint为0x30000000。(4).编译连接工程,选择Project|Debug,启动AXD进行软件仿真调试。(5).打开寄存器窗口(ProcessorRegisters),选择Current项监视寄存器R0,R1,R13(SP)和R14(LR)的值。(6).打开存储器观察窗口(Memory),设置观察地址为0x30003EA0,显示方式Size为8Bit,监视从0x30003F00起始的满递减堆栈区。(7).单步运行程序,跟踪程序执行的流程,观察寄存器值的变化和堆栈区的数据变化,判断执行结果是否正确。(8).调试程序时,更改参数X和n来测试程序,观察是否得到正确的结果。例如:先复位程序,接着单步执行到“BLPOW”指令,在寄存器窗口中将R0,R1的值进行修改,然后继续运行程序。说明:用鼠标双击寄存器窗口的寄存器,即可修改寄存器的值。输入数据可以是十进制数(如136,198),也可以是十六进制数(如0x123,0xF0),输入数据后回车确定。6实验报告内容分析汇编程序各行的功能或作用(2)叙述ARM中乘法指令的特点(3)叙述ARM中的B指令与BL指令的区别7参考程序XEQU9nEQU2AREAExample2,CODE,READONLYENTRYCODE32STARTLDRSP,=0x30003F00LDRR0,=XLDRR1,=nBLPOWHALTBLHALTPOWSTMFDSP!,{R1-R12,LR}MOVSR2,R1MOVEQR0,#1;IF(R1)=0THEN(R0)=1BEQPOW_END;ANDJUMPTOPOW_END,ELSEMOVR1,R0SUBR2,R2,#1POW_L1BLDO_MULSUBSR2,R2,#1BNEPOW_L1POW_ENDLDMFDSP!,{R1-R12,PC};POPSTATICRETURNTOMAINPROGRAMDO_MULMULR0,R1,R0MOVPC,LR;RETURNTOMAINPROGRAMEND实验三ARMC/C++语言实验11实验目的通过实验了解使用ADS1.2编写C语言程序,并进行调试。2实验内容(1)编写一个汇编程序文件和一个C程序文件,汇编程序的功能是初始化堆栈指针和初始化C程序的运行环境,然后跳转到C程序运行,这就是一个简单的启动程序。C程序使用加法运算来计算1+2+3+…+(N-1)+N的值(N>0)。(2)使用ADS1.2软件仿真,单步,全速运行程序,设置断点,打开寄存器窗口(ProcessorRegisters)监视R0,R1的值,打开存储器观察窗口(Memory)监视0x30003000上的值。3预备知识(1)ARM指令系统内容;(2)APCS(ARMProcedureCallStandard)过程调用内容;(3)ADS1.2工程编辑和AXD调试的内容。4实验设备硬件:PC机一台。软件:Windows98/XP/2000系统,ADS1.2集成开发环境。5实验步骤(1).启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程c1.mcp。(2).建立汇编源文件Startup.s和c1.c,编写实验程序,然后添加到工程中。(3).设置工程连接地址ROBase为0x30000000,RWBase为0x30003000,设置调试口地址Imageentrypoint为0x30000000。(4).设置位于开始位置的起始代码段。方法:在ARMLinker中的Object/Symbol的栏中填写Startup.o,即Startup.s文件的目标代码;在Section栏中填写启动段名Start。(5).编译连接工程,选择Project|Debug,启动AXD进行软件仿真调试。(6).在Startup.S的”BMain”处设置断点,然后全速运行程序。(7).程序在断点处停止,单步运行程序,判断程序是否跳转到C程序中运行。(8).选择ProcessorViews|Variables打开变量观察窗口,观察全局变量的值,单步/全速运行程序,判断程序的运算结果是否正确。6实验报告内容在ADS1.2中能直接编写C语言程序进行运行吗?为什么?在汇编语言中调用C语言的格式怎样?汇编语言如何向C程序语言函数传递参数?7参考程序(1)汇编语言Startup.s程序代码IMPORT|Image$$RO$$Limit|IMPORT|Image$$RW$$Base|IMPORT|Image$$ZI$$Base|IMPORT|Image$$ZI$$Limit|IMPORTMainAREAStart,CODE,READONLYENTRYCODE32ResetLDRSP,=0x40003F00LDRR0,=|Image$$RO$$Limit|LDRR1,=|Image$$RW$$Base|LDRR3,=|Image$$ZI$$Base|CMPR0,R1;比较只读区域结束地址和读写区域起始地址,目的是判断有几个执;行区域,影响标志位ZBEQLOOP1;如果只有一个可执行区域,直接在读写区域末尾进行ZI区域的0初始化,;即跳到LOOP1标号处;否则顺序执行标号LOOP0LOOP0CMPR1,R3;比较不断增大的读写区域起始地址与0初始化区域的起始地址。;影响标志位C,如果R1<R3,C=0,条件CC为True,执行以下3条语句。LDRCCR2,[R0],#4;将[R0]处的内容搬移到[R1]处STRCCR2,[R1],#4BCCLOOP0;如果不相等,跳回LOOP0继续搬移数据(可能包含能改变自身的;程序),如果相等,则执行LOOP1标号后的程序LOOP1LDRR1,=|Image$$ZI$$Limit|;这里R1又重新赋值为ZI的末地址MOVR2,#0LOOP2CMPR3,R1;比较ZI的开始地址R3与末地址R1,如果R3<R1,则CC为TrueSTRCCR2,[R3],#4;初始化ZI区域BCCLOOP2;如果0初始化区域的终止地址小于不断增大的0初始化区域起始地址,;则跳到标号LOOP2处继续循环执行BMainEND(2)C语言C1.C程序代码#defineuint8unsignedchar#defineuint32unsignedint#defineN100uint32sum;voidMain(void){uint32i;sum=0;for(i=0;i<=N;i++){sum+=i;}while(1);}说明:①使用IMPORT关键字说明的几个变量是ADS编译器使用的变量;②|Image$$RO$$Base|是程序段的起始地址,即在编译器中RO的首地址,例如0x30000000。|Image$$RO$$Limit|是代码段占用的末尾地址加1,此地址无代码段内容,上一地址号有代码内容。代码段存储代码编译内容和程序中定义的常量。③|Image$$RW$$Base|是在编译器中配置的RW的首地址,例如0x30003000。|Image$$RW$$Limit|是数据段占用的末尾地址多1,它也是|Image$$ZI$$Base|的地址值,此地址无数据段内容,上一地址号有数据内容。数据段存储程序中定义的可读写的全局变量和静态变量。④|Image$$ZI$$Base|是RW段中要被初始化为零(ZIZeroInit)的变量段的起始地址,它与RW段的地址是连续的,即等于|Image$$RW$$Limit|。|Image$$ZI$$Limit|是初始化为0的RW段占用的末尾地址。即ZI数据段存储程序中定义的全局变量,但没有赋值。⑤经编译器编译的程序代码的空间分布是,代码段编译代码、有初始化赋值的RW数据段代码、没有初始化的全局变量代码ZI数据段。它们编译后是连续分布的,经main函数前面的一段汇编语言程序,程序代码段的物理存储位置保持不变,首地址为|Image$$RO$$Base|,RW数据段将搬移到编译器配置的实际物理地址|Image$$RW$$Base|的首地址处,之后连续搬移存放ZI数据段。⑥C编译后的存储器分布与ADS的存储器分布映射图注意:|Image$$RO$$Limit|就是为判断|Image$$RW$$Base|而设计的,当|Image$$RO$$Limit|大于|Image$$RW$$Base|时,说明ADS设置的数据区RW区初值设置太小,没有给代码区留有足够的空间。此程序中没有考虑到这种情形。当|Image$$RO$$Limit|等于|Image$$RW$$Base|时,说明ADS设置的数据区RW区正好与代码的数据区重合,此时不需要对RW的数据区进行搬移,只需要将ZI区清“0”。当|Image$$RO$$Limit|小于|Image$$RW$$Base|时,说明ADS设置的数据区RW区初值大于C代码段的末值,需要对数据区RW进行搬移。实验四ARMC/C++语言实验21实验目的掌握在C语言程序中调用汇编程序,了解ATPCS基本规则。2实验内容(1)在C程序调用汇编子程序,实现两个整数的加法运算。汇编子程序的原型为:unit32Add(unit32x,unit32y)其中,unit32已定义为unsignedint.(2)使用ADS1.2软件仿真,单步,全速运行程序,设置断点,打开寄存器窗口(ProcessorRegisters)监视R0,R1的值,打开存储器观察窗口(Memory)监视0x30003000上的值。3预备知识(1)ARM指令系统内容;(2)ARM的ATPCS的相关内容;(3)ADS1.2工程编辑和AXD调试的内容。4实验设备硬件:PC机一台。软件:Windows98/XP/2000系统,ADS1.2集成开发环境。5实验步骤(1)启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程c2.mcp。(2)建立汇编源文件Startup.S,Add.S和c2.c,编写实验程序,然后添加到工程中。(3)设置工程连接地址ROBase为0x30000000,RWBase为0x30003000,设置调试口地址Imageentrypoint为0x30000000。(4)设置工程连接选项,位于开始位置的起始代码段设置为Startup.o的Start段.(5)编译连接工程,选择Project|Debug,启动AXD进行软件仿真调试。(6).在c1.c文件中的调用Add()的代码处设置断点,然后全速运行程序。(7)程序在断点处停止,使用StepIn单步运行程序,观察程序是否跳转到汇编程序中Add.s运行。(8)选择ProcessorViews|Variables打开变量观察窗口,观察全局变量的值,单步/全速运行程序,判断程序的运算结果是否正确。6实验报告内容简述ATPCS含义和内容。(2)论述在C语言程序中如何调用汇编语言。7参考程序(1)汇编语言启动程序Startup.s代码IMPORT|Image$$RO$$Limit|IMPORT|Image$$RW$$Base|IMPORT|Image$$ZI$$Base|IMPORT|Image$$ZI$$Limit|IMPORTMainAREAStart,CODE,READONLYENTRYCODE32ResetLDRSP,=0x30003F00LDRR0,=|Image$$RO$$Limit|LDRR1,=|Image$$RW$$Base|LDRR3,=|Image$$ZI$$Base|CMPR0,R1BEQLOOP1LOOP0CMPR1,R3LDRCCR2,[R0],#4STRCCR2,[R1],#4BCCLOOP0LOOP1LDRR1,=|Image$$ZI$$Limit|MOVR2,#0LOOP2CMPR3,R1STRCCR2,[R3],#4BCCLOOP2BMainEND(2)C语言调用汇编语言程序#defineuint8unsignedchar#defineuint32unsignedintexternuint32Add(uint32x,uint32y);uint32sum;voidMain(void){sum=Add(555,168);while(1);}(3)汇编加法程序代码EXPORTAddAREAAdd1,CODE,READONLYENTRYCODE32AddADDR0,R0,R1MOVPC,LREND实验五寄存器装载及存储汇编指令实验1实验目的(1)熟悉ADS1.2软件开发环境;(2)掌握寄存器装载指令的条件执行等和使用各种形式的寄存器装载指令完成存储器的访问。2实验内容(1)主要内容:①单一指令加载/存储指令(LDR/STR)的基本格式有:LDR/STR{条件码}{类型码}Rd,[Rn]LDR/STR{条件码}{类型码}Rd,[Rn,Flexoffset]{!}LDR/STR{条件码}{类型码}Rd,labelLDR/STR{条件码}{类型码}Rd,[Rn],Flexoffset说明:条件码:可选,默认是无条件执行。内容见表2.6.1ARM条件码表。类型码:可选,默认是字(32bit)。也可以是字节B、带符号字节SB、无符号半字H、有符号半字SH和双字D。Rd:为ARM9的内部寄存器,作为加载/存储操作的目的/源。Rn:为ARM9加载/存储的源/目的。Flexoffset:表示地址偏移量。与Rn寄存器的值相加后得到有效的操作数地址。有以下2种形式:一个立即数,范围-4095~+4095,书写格式#常数或#常数表达式。一个内含偏移量的寄存器Rm,m≠15。书写格式为:{}Rm{,shift}。shift代表Rm的可选移位方法,有:ASRn算术右移n;LSLn逻辑左移n;LSRn逻辑右移n;RORn循环右移n;RRX带扩展循环右移1位;label:表示一个偏移表达式。该偏移量加上PC值后,得到操作数的有效地址。注意偏移量在当前指令的上下4K范围内。!:表示写回地址的符号,可选。若带有后缀!,表示加载/存储完成后,将包含偏移量的新地址写回Rn。②多数据加载/存储指令(LDM/STM)的基本格式是:LDM/STM{条件码}类型码Rn{!},寄存器列表{^}条件码:同上。类型码:取其下列情况之一:IA:传送数据之后,修改指针加1;IB:传送数据之前,修改指针加1;DA:传送数据之后,修改指针减1;DB:传送数据之前,修改指针减1;FD:满递减堆栈;(ADS的堆栈方式)ED:空递减堆栈;FA:满递增堆栈;EA:空递增堆栈;Rn:是内部寄存器,但不允许是R15,用作存储器地址指针。寄存器列表:在格式中使用大括号括起来的内部寄存器,一般用逗号分开。当使用连续号的寄存器时,使用减号“-”恢复CPSR寄存器的值使用符号“^”:在把PC值存储到内存中时,同时也将CPSR的值存入到了内存中。在重新装载PC值时,若要同时恢复CPSR寄存器的值,则使用符号“^”,例如:STMFDR13!,{R0-R12,R14}……LDMFDR13!,{R0-R12,PC}^(2)主要实验项目①使用ADS1.2软件仿真,单步执行,观察通用寄存器、状态寄存器和存储器窗口内容的变化;②编制在各种基本指令下指令实验程序,上机调试,使用各种窗口观察实验结果;③编制无符号字节块、无符号半字块和字块的传送指令,使用汇编伪指令DCB定义字节数据、DCW定义半字数据、DCD定义字数据。使用ARM伪指令ADR、LDR设置块的首地址,完成各数据块的传送与拷贝工作。3预备知识(1)ARM指令系统的寄存器装载及存储指令;(2)ADS1.2工程编辑和AXD调试。4实验设备硬件:PC机一台。软件:Windows98/XP/2000系统,ADS1.2集成开发环境。5实验步骤(1)启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程arm1.mcp。(2)建立汇编源文件Exp5_arm.s,使用寄存器装载及存储指令编写实验程序,然后添加到工程中。(3)设置工程连接地址ROBase为0x30000000,RWBase为0x30003000,设置调试口地址Imageentrypoint为0x30000000。(4)编译连接工程,选择Project|Debug,启动AXD进行软件仿真调试。(5)打开寄存器窗口(ProcessorRegisters),选择Current项监视其中寄存器的值。打开存储器观察窗口(Memory),设置观察存储器操作的地址内容。(6)单步运行程序,或设置断点进行观察。6、实验报告内容寄存器装载及存储指令可以完成哪些任务。进行数据快传送编程时,块的首地址怎样设置,如何完成传送任务。简要总结实验的内容和收获。实验六算术加/减法汇编指令实验1实验目的(1)熟悉ADS1.2软件开发环境;(2)掌握算术逻辑指令对标志寄存器标志的影响、条件执行和功能等;(3)使用算术指令编写简单的汇编程序并进行调试。2实验内容(1)主要内容①不带进位ADD、带进位ADC加法指令,其基本格式为:ADD/ADC{条件码}{S}Dest,Op1,Op2说明:条件码:可选,默认是无条件执行。内容见表2.6.1ARM条件码表。S:可选,默认是不影响状态寄存器CPSR的标志位。当选写S时,则影响CPSR的标志位。Dest:为目的寄存器Rd。Op1、Op2:为两个操作数,Op2也可以是寄存器移位操作的结果。不带进位ADD指令完成的功能是:Dest=Op1+Op2主要形式有:ADDRd,Rm,Rn;Rd=Rm+RnADDRd,Rm,#立即数;Rd=Rm+立即数ADDRd,Rm,Rn,shift;Rd=Rm+Rnshift带进位ADC指令完成的功能是:Dest=Op1+Op2+进位位。主要形式有:ADCRd,Rm,Rn;Rd=Rm+Rn+进位位ADCRd,Rm,#立即数;Rd=Rm+立即数+进位位ADCRd,Rm,Rn,shift;Rd=Rm+Rnshift+进位位shift代表Rm的可选移位方法,有:ASRn算术右移n;LSLn逻辑左移n;LSRn逻辑右移n;RORn循环右移n;RRX带扩展循环右移1位;②不带借位SUB指令、带借位SBC指令的基本格式是:SUB/SBC{条件码}{S}Dest,Op1,Op2说明:条件码、S、Dest、Op1、Op2:同上。不带借位SUB指令完成的功能是:Dest=Op1-Op2主要形式有:SUBRd,Rm,Rn;Rd=Rm-RnSUBRd,Rm,#立即数;Rd=Rm-立即数SUBRd,Rm,Rn,shift;Rd=Rm-Rnshift带借位SBC指令完成的功能是:Dest=Op1-Op2-!Carry主要形式有:SBCRd,Rm,Rn;Rd=Rm-Rn-!CarrySBCRd,Rm,#立即数;Rd=Rm-立即数-!CarrySBCRd,Rm,Rn,shift;Rd=Rm-Rnshift-!CarryShift同上③反向减法指令RSB、带借位反向减法指令RSC的基本格式是:RSB/RSC{条件码}{S}Dest,Op1,Op2说明:条件码、S、Dest、Op1、Op2:同上。反向减法指令RSB完成的功能是:Dest=Op2-Op1主要形式有:RSBRd,Rm,Rn;Rd=Rn-RmRSBRd,Rm,#立即数;Rd=立即数-RmRSBRd,Rm,Rn,shift;Rd=Rnshift-Rm带借位反向减法指令RSC完成的功能是:Dest=Op2-Op1-!Carry主要形式有:RSCRd,Rm,Rn;Rd=Rn-Rm-!CarryRSCRd,Rm,#立即数;Rd=立即数-Rm-!CarryRSCRd,Rm,Rn,shift;Rd=Rnshift-Rm-!CarryShift同上④位逻辑指令“与”AND、“或”ORR、“异或”EOR和位清除指令BIC,其指令格式为:操作码{条件码}{S}Dest,Op1,Op2功能如下:AND功能:Dest=Op1ANDOp2;位与ORR功能:Dest=Op1ORROp2;位或EOR功能:Dest=Op1ANDOp2;位异或AND功能:Dest=Op1AND!Op2;将OP2中为1位的对应位清0(2)主要完成的工作①编写一个汇编程序,通过寄存器窗口观察每一指令的运行结果和CPSR的状态标志位;②编写代码实现无符号数(R1)(R0)+(R3)(R2)→(R1)(R0),若有益处,则将R4的低8位通过BIC指令或AND、ORR指令设置为Oxaa,否则设置为0x55;③编写代码实现无符号数(R1)(R0)-(R3)(R2)→(R1)(R0),若有借位,则将R4的低8位通过BIC指令或AND、ORR指令设置为Oxaa,否则设置为0x55;④编写程序计算1+2+22+23+……+220的值。3预备知识(1)ARM指令系统的算术加/减法指令;(2)ADS1.2工程编辑和AXD调试。4实验设备硬件:PC机一台。软件:Windows98/XP/2000系统,ADS1.2集成开发环境。-5实验步骤(1)启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程arm4.mcp。(2)建立汇编源文件Exp6_arm.s,使用算术类指令(主要是加减法)编写实验程序,然后添加到工程中。(3)设置工程连接地址ROBase为0x30000000,RWBase为0x30003000,设置调试口地址Imageentrypoint为0x30000000。(4)编译连接工程,选择Project|Debug,启动AXD进行软件仿真调试。(5)打开寄存器窗口(ProcessorRegisters),选择Current项监视其中寄存器的值。打开存储器观察窗口(Memory),设置观察存储器操作的地址内容。(6)单步运行程序,或设置断点进行观察。6、实验报告内容简述ARM加/减法指令的种类,各指令完成的功能。简述ARM逻辑指令与位清0指令完成的功能。写出上述实现无符号数相加减的部分程序代码片段。实验七ARM乘法及其它指令汇编指令实验1实验目的(1)掌握ARM乘法及其它指令对标志寄存器标志的影响、条件执行和功能等;(2)使用乘法指令编写简单的汇编程序并进行调试。2实验内容(1)主要内容①32位乘法指令MUL、32位乘加指令MLA,其基本格式分别为:乘法指令:MUL{条件}{S}Dest,Op1,Op2;Dest=Op1×Op2乘加指令MLA{条件}{S}Dest,Op1,Op2,Op3;Dest=Op1×Op2+Op3说明:条件码、S与之前的意义相同;所有的操作数以及目的寄存器必须是简单的寄存器,不能是立即数或被移位的寄存器;目的寄存器与操作数1必须是不同的寄存器,但不能使用R15寄存器。②64位有符号数乘法指令SMULL、乘加指令SMLAL和64位无符号数乘法指令UMULL、乘加指令UMLAL说明:具体格式参阅第2章的相关内容。64位有符号数乘法指令SMULL{条件}{S}<RdLo>,<RdHi>,<Rm>,<Rs>;Rd←Rm×Rs64位有符号数乘加指令SMLAL{条件}{S}<RdLo>,<RdHi>,<Rm>,<Rs>;RdLo←(Rm×Rs)Lo+RdLoRdHi←(Rm×Rs)Hi+RdHi注意:该指令高位计算时也包含低位的进位位,但是高位相加的进位不影响CPSR中的进位位C64位无符号数乘法指令UMULL{条件}{S}<RdLo>,<RdHi>,<Rm>,<Rs>;Rd←Rm×Rs64位无符号数乘加指令UMLAL{条件}{S}<RdLo>,<RdHi>,<Rm>,<Rs>;RdLo←(Rm×Rs)Lo+RdLoRdHi←(Rm×Rs)Hi+RdHi注意:该指令高位计算时也包含低位的进位位,但是高位相加的进位不影响CPSR中的进位位C(实验已证明)③传送指令MOV和传送取反值指令MVN指令,其基本格式分别是:传送指令MOV:MOV{条件码}{S}Dest,Op1;Dest←Op1说明:条件码、S、Dest:同上。Op1可以是寄存器或寄存器移位;Dest与Op1可以是相同的寄存器,此时指令的功能等价于NOP指令;例movr0,r0可以对相同的寄存器进行移位操作;例:MOVR0,R0,LSL#3传送取反值指令MVN:MVN{条件}{S}Dest,Op1;Dest←~Op1,按位取反说明:MVN把Op1操作数,可以是立即数、寄存器或移位的寄存器的值按位取反后传送给Dest寄存器。例:MOVR0,#4;(R0)=0XFFFFFFF0④比较指令CMP、取反比较指令CMN,其基本指令格式是:CMP比较指令:CMP{条件}Op1,Op2功能:完成Op1-Op2运算但不保存结果,只影响CPSR的标志,与减法指令SUBS相同。用于判断两个操作数的大小,以决定之后的条件汇编指令能否执行。CMN比较指令:CMN{条件}Op1,Op2功能:完成Op1+Op2运算但不保存结果,只影响CPSR的标志,与加法指令ADDS相同。用以决定之后的条件汇编指令能否执行。④位测试指令TST和相等测试指令TEQ,其指令格式为:位测试指令TST:TST{条件码}Op1,Op2功能:完成Op1ANDOp2位“与”运算,但不存储运算结果,只影响CPSR的相应的标志位Z,与ANDS相同。Op1一般是一个寄存器,Op2一般是一个用于测试位掩码的立即数,用于测试对应掩码位“1”是否全为“0”。若Z=1,则全为0,否则不全为0。例:TSTR0,#%1;IFZ==1,THENR0ISALL0.WHERE“%”ISBINARY相等测试指令TEQ:TEQ{条件码}Op1,Op2功能:完成Op1EOROp2位“异或”运算,但不存储运算结果,只影响CPSR的相应的标志位Z,与EORS相同。Op1一般是一个寄存器,Op2一般是一个测试的立即数。若Z=1,则表示相等,否则不相等。例:TEQR0,#%1;IFZ==1,THENR0IS1.WHERE“%”ISBINARY(2)主要完成的工作编写一个汇编程序,运用本实验的指令,通过寄存器窗口观察每一指令的运行结果和CPSR的状态标志位;编写代码实现无符号数(R1)(R0)×(R3)(R2)→(R3)(R2)(R1)(R0),即完成2个64bit的无符号数相乘得到一个128bit的无符号数。3预备知识(1)ARM指令系统的乘法指令、传送指令、比较指令和测试指令;(2)ADS1.2工程编辑和AXD调试。4实验设备硬件:PC机一台。软件:Windows98/XP/2000系统,ADS1.2集成开发环境。5实验步骤(1)启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程arm4.mcp。(2)建立汇编源文件arm5.s,使用64位无符号乘法指令编写实验程序,然后添加到工程中。(3)设置工程连接地址ROBase为0x30000000,RWBase为0x30003000,设置调试口地址Imageentrypoint为0x30000000。(4)编译连接工程,选择Project|Debug,启动AXD进行软件仿真调试。(5)打开寄存器窗口(ProcessorRegisters),选择Current项监视其中寄存器的值。打开存储器观察窗口(Memory),设置观察存储器操作的地址内容。(6)单步运行程序,或设置断点进行观察。6、实验报告内容简述本实验中各指令完成的功能。写出上述实现无符号数相乘的部分程序代码片段。实验八ARM处理器工作模式与堆栈指针设置实验1实验目的(1)通过实验掌握学会使用MSR和MRS指令实现ARM工作模式的切换,观察不同模式下的寄存器,尤其是状态寄存器,加深对CPU的理解;(2)掌握ARM堆栈指针SP的设置方法和意义,在设置好的堆栈中压入适当的数据,并使用寄存器窗口、存储器窗口观察。2实验内容(1)主要内容ARM9处理器支持7中工作运行模式(如表1)表1.ARM9运行模式处理器模式处理器模式描述CPSR寄存器的M[4:0]的值用户模式usrARM处理器正常程序执行模式0b10000快速中断模式fiq用于高速数据传输或通道处理0b10001外部中断模式irq用于通用的中断处理0b10010管理模式svc操作系统使用的保护模式0b10011数据访问终止模式abt当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护0b10111未定义指令终止模式und当未定义的指令执行时进入该模式0b11011系统模式sys运行具有特权的操作系统任务0b11111特权模式:又称非用户模式。是指除用户模式以外的6种模式。在这些模式下程序可以访问所有的系统资源,也可以任意地进行处理器模式切换。用户模式下是不允许模式切换的。异常模式:是指除用户模式和系统模式以外地5种模式,常用于处理中断。异常模式有:FIQ(FastInterruptReQuest)IRQ(InterruptReQuest)管理svc(Supervisor)中止abt(Abort)未定义und(Undefined)在特定地异常出现时,进入相应的模式。某种模式都有附加的寄存器,以避免出现异常时用户模式的状态不可靠。在软件的控制下可以改变模式,外部中断和异常也可以引起模式发生改变。大多数应用程序在用户模式下执行。当处理器工作在用户模式时,正在执行的程序不能访问某些被保护的处理器资源,也不能改变模式,除非异常(Exception)发生。这允许适当编写操作系统来控制系统资源的使用。ARM9体系结构的异常类型和异常处理模式(如表2)表2异常类型进入模式地址(异常向量)优先级复位管理模式0x000000001(最高)未定义指令未定义模式0x000000046(最低)软件中断管理模式0x000000086(最低)指令预取中止中止模式0x0000000C5数据中止中止模式0x000000102外部中断请求外部中断请求模式0x000000184快速中断请求快速中断请求模式0x0000001C3②状态寄存器CPSR/SPSR以及对其进行的访问状态寄存器CPSR和SPSR:包含了条件码标志,中断禁止位,当前处理器模式以及其它状态和控制信息。每种异常都有一个程序状态保存寄存器SPSR,当异常出现时SPSR用于保存CPSR的状态值。CPSR和SPSR的格式如下:NZCVQ预留IFTM4M3M2M1M0状态位:位31-28依次为N、Z、C、V分别表示符号位Negative、零位Zero、进位位Carry和溢出位Overflow。控制位:中断控制位I(b7)、快速中断控制位F(b6)和ARM/Thumb控制位。M4、M3、M2、M1、M0(M[4:0])是模式控制位,反映和决定ARM处理器的工作模式。对CPSR寄存器的访问程序状态寄存器到通用寄存器传送指令格式MRS{条件码}Op1,CPSR/SPSR;Op1←CPSR/SPSR说明:Op1是通用寄存器;CPSR是当前程序状态寄存器。通用寄存器到程序状态寄存器传送指令格式MSR{条件码}CPSR/SPSR,Op2_Domain,;CPSR/SPSR←Op2说明:Op2是通用寄存器;CPSR是当前程序状态寄存器。域Domain用于设置CPSP/SPSR中需要操作的位,32位的程序状态寄存器被分为4个域:最高8位,即b31-b24为条件标志位域,用f表示。在指令中的形式为CPSR_f。次高8位,即b23~b16为状态位域,用s表示。目前备用。次低8位,即b18~b8为扩展域,用x表示。目前备用。最低8位,即b7~b0为控制位域,用c表示。在指令中的形式为CPSR_c。(2)主要完成的工作①编写一个汇编程序,程序的入口地址为0x00000000,即进入到系统的启动入口Reset,此时系统进入到管理模式,这时就可以进行模式的切换,设置各模式下的SP指针,并写入数据在相应的模式状态下观察SP指针值和相应的存储单元内容;或通过访问ARM9中不存在的地址程序,使程序发生取址中断异常,进入此模式后,改变其专有的R13、R14的值,并进行观察。之后可以改变M[4:0]的取值而进入相应的模式,对其专有的寄存器赋值并观察,最后回到用户模式。②编写各堆栈区初始化汇编程序。利用汇编伪指令EQU定义模式字、所有栈顶的基址,然后根据各个栈区的大小连续向下设置各个栈的SP指针。3预备知识(1)ARM9的工作模式、特权模式、异常模式以及模式之间的转换;(2)ARM9的堆栈及堆栈指针寄存器。4实验设备硬件:PC机一台。软件:Windows98/XP/2000系统,ADS1.2集成开发环境。5实验步骤(1)启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程exp8.mcp。(2)建立汇编源文件Exp8_arm.s,主要使用MRS/MSR等指令编写汇编程序,然后添加到工程中。(3)设置工程连接地址ROBase为0x00000000,RWBase为0x30003000,设置调试口地址Imageentrypoint为0x00000000。(4)编译连接工程,选择Project|Debug,启动AXD进行软件仿真调试。(5)打开寄存器窗口(ProcessorRegisters),选择Current项监视其中寄存器的值。打开存储器观察窗口(Memory),设置观察存储器操作的地址内容。(6)单步运行程序,或设置断点进行观察。6、实验报告内容简述ARM系统的工作模式、特权模式和异常模式。为什么每一模式下都要设置相应的堆栈SP指针?指针的设置方法如何?实验九LED虚拟显示混合编程实验1实验目的(1)通过实验掌握学会使用ARMGPIO端口,设置端口对应的控制寄存器和上拉电阻寄存器,读/写数据寄存器的内容,即对应端口的数据;(2)学会使用汇编语言和C语言对端口的控制。学习软件延时汇编程序的编写;通过寄存器窗口观察输出引脚的信号变化。(3)进一步掌握汇编语言与C语言混合编程的规则。2实验内容(1)使用汇编语言编写主程序,控制端口G0引脚并使LED熄灭,使G1引脚的LED点亮。编写适当的延时程序。主程序使2个LED周期性地轮流交替点亮与熄灭。(2)使用C语言编写程序,控制端口G0引脚点亮LED显示,熄灭G1引脚的LED。3预备知识(1)熟悉ARM处理器通用端口GPIO使用方法。(2)熟悉使用ARM汇编语言、C语言对通用I/O端口的控制与访问。(3)ADS1.2工程编辑和AXD调试。4实验设备硬件:PC机一台。软件:Windows98/XP/2000系统,ADS1.2集成开发环境。5实验步骤(1)启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程Exp9.mcp。(2)建立汇编源文件Exp9_arm.s,使用ARM汇编语言对GPIO端口的访问方法编写实验程序,然后添加到工程中。包括汇编延时子程序。(3)使用C语言对ARM的GPIO端口的控制方法编写C语言程序Exp9_c.c,并添加到工程中。(4)设置工程连接地址ROBase为0x30000000,RWBase为0x30003000,设置调试口地址Imageentrypoint为0x30000000。(5)编译连接工程,选择Project|Debug,启动AXD进行软件仿真调试。(6)打开存储器观察窗口(Memory),设置观察实验I/O口对应存储器地址内容。(6)单步运行程序,或设置断点进行观察。6、实验报告内容简述ARM9的通用I/O端口、并叙述对其的访问方法。分别写出使用汇编语言和C语言访问通用I/O端口的主要语句。实验十汇编-C语言数据块拷贝编程实验1实验目的(1)通过实验掌握学会使用汇编语言调用C语言程序的方法、以及参数传递的方法。(2)学会使用C语言编写ARM中字符数据块,半字数据块和字数据块的拷贝方法。2实验内容①编写一个汇编程序,为C语言的编译与运行建立环境。同时编写数据段,为数据块的拷贝建立储存区域,并在汇编语言中给数据源数据区赋值。②编写C语言字符块拷贝函数,在汇编语言中调用。可以使用指针或函数strcpy()进行编写。③编写C语言半字块拷贝函数,在汇编语言中调用。可以使用16位的short型指针编写。④编写C语言字块拷贝函数,在汇编语言中调用。可以使用32位的int型等指针编写。3预备知识(1)汇编语言调用C语言的参数传递;(2)C语言中的相关函数和指针的应用;(3)ADS1.2工程编辑和AXD调试。4实验设备硬件:PC机一台。软件:Windows98/XP/2000系统,ADS1.2集成开发环境。5实验步骤(1)启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程exp10.mcp。(2)建立汇编源文件startup.s,包括对数据区的赋值、参数传递地址的获取、参数的传递和C语言函数的调用。将其添加到工程中。(3)建立编写C语言文件exp_c10.c,实现各种数据块的拷贝。(4)设置工程连接地址ROBase为0x00000000,RWBase为0x30003000,设置调试口地址Imageentrypoint为0x30000000。(5)编译连接工程,选择Project|Debug,启动AXD进行软件仿真调试。(6)打开寄存器窗口(ProcessorRegisters),选择Current项监视其中寄存器的值。打开存储器观察窗口(Memory),设置观察存储器操作的地址内容。(7)单步运行程序,或设置断点进行观察。6、实验报告内容怎样实现汇编语言到C语言函数参数的传递。观察存储器窗口,在各种数据块拷贝时,指针本身的字节长度与指针中内容的字节长度有什么区别。实验十一C-汇编语言数据块拷贝编程实验1实验目的(1)通过实验掌握学会使用C语言调用汇编语言程序的方法、以及参数传递的方法。(2)学会使用汇编语言编写ARM中字符数据块,半字数据块和字数据块的拷贝方法。2实验内容①编写一个汇编程序,为C语言的编译与运行建立环境。同时编写数据段,为数据块的拷贝建立储存区域,并在汇编语言中给数据源数据区赋值。②编写汇编语言字符块拷贝函数,在C语言中调用。③编写汇编语言半字块拷贝函数,在C语言中调用。④编写汇编语言字块拷贝函数,在C语言中调用。3预备知识(1)C语言调用汇编语言的方法以及参数传递;(2)汇编语言拷贝字节数据块、半字数据块和字数据块的编程方法;(3)ADS1.2工程编辑和AXD调试。4实验设备硬件:PC机一台。软件:Windows98/XP/2000系统,ADS1.2集成开发环境。5实验步骤(1)启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程exp11.mcp。(2)建立汇编源文件startup.s,包括对数据区的赋值并跳转到C的主函数中。(3)建立编写C语言主函数文件exp11_c.c,调用汇编语言编写的块拷贝程序;编写汇编语言文件exp11_asm.s,实现各种长度数据的拷贝。(4)设置工程连接地址ROBase为0x00000000,RWBase为0x30003000,设置调试口地址Imageentrypoint为0x30000000。(5)编译连接工程,选择Project|Debug,启动AXD进行软件仿真调试。(6)打开寄存器窗口(ProcessorRegisters),选择Current项监视其中寄存器的值。打开存储器观察窗口(Memory),设置观察存储器操作的地址内容。(7)单步运行程序,或设置断点进行观察。6、实验报告内容怎样实现C汇编语言调用汇编语言。(2)字节、半字和字在存储器是怎样存储的。实验十二汇编-C语言整型4参数加法编程实验1实验目的(1)通过实验掌握学会使用汇编语言程序调用C语言程序的方法;(2)掌握ARM汇编语言程序向C语言程序传递参数的寄存器R0—R4的使用以及C语言返回值根据返回值的长度不同在R0、R1中的存取形式并进行读取。2实验内容(1)编写一个汇编程序,建立C语言的运行环境并调用C语言4参数的加法程序;(2)用C语言编写具有4参数的int、short和无符号的char的加法功能的函数。3预备知识(1)ARM系统的ATPCS规则标准。(2)ARM汇编语言调用C语言的规则。(3)ADS1.2工程编辑和AXD调试。4实验设备硬件:PC机一台。软件:Windows98/XP/2000系统,ADS1.2集成开发环境。5实验步骤(1)启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程exp12.mcp。(2)建立汇编源文件exp12_arm.s并进行编写;分别编写C语言函数longadd1(int,int,int,int,int)、intadd2(short,short,short,short)和shortadd3(unsignedchar,unsignedchar,unsignedchar,unsignedchar,),然后添加到工程中。(3)设置工程连接地址ROBase为0x30000000,RWBase为0x30003000,设置调试口地址Imageentrypoint为0x30000000。(4)编译连接工程,选择Project|Debug,启动AXD进行软件仿真调试。(5)打开寄存器窗口(ProcessorRegisters),选择Current项监视其中寄存器的值。打开存储器观察窗口(Memory),设置观察存储器操作的地址内容。(6)单步运行程序,或设置断点进行观察。6、实验报告内容写出实验中汇编程序调用C程序的语法。对于具有不同长度返回值的C语言函数,根据实验结果指出在寄存器R0、R1中的存储。实验十三汇编-C语言BCD码编程实验1实验目的(1)通过实验掌握学会在C语言中BCD码的实现算法及其编程。(2)掌握在ARM汇编中使用C语言定义的全局变量。2实验内容(1)编写C语言程序,实现保留4位BCD码的输出,并分别存放在4个全局变量中。(2)编写ARM汇编语言程序,使用C语言中定义的全局变量传递参数,并将结果存放在R0寄存器中。3预备知识(1)ARM汇编语言中调用C语言全局变量的方法。(2)ADS1.2工程编辑和AXD调试。4实验设备硬件:PC机一台。软件:Windows98/XP/2000系统,ADS1.2集成开发环境。5实验步骤(1)启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程exp13.mcp。(2)建立汇编源文件startup.s,建立C语言的运行环境,并完成对C语言函数和全局变量的调用,然后添加到工程中;编写C语言程序文件exp13_c.c,完成BCD码的转换,并将4位BCD码分别存放在4个全局变量中,然后添加到工程中。(3)设置工程连接地址ROBase为0x30000000,RWBase为0x30003000,设置调试口地址Imageentrypoint为0x30000000。(4)编译连接工程,选择Project|Debug,启动AXD进行软件仿真调试。(5)打开寄存器窗口(ProcessorRegisters),选择Current项监视其中寄存器的值。打开存储器观察窗口(Memory),设置观察存储器操作的地址内容。(6)单步运行程序,或设置断点进行观察。6、实验报告内容在AXD中怎样观察全局变量。(2)加入用汇编语言实现BCD码的转换,情况如何。实验十四C-汇编语言整型4参数加法编程实验1实验目的(1)通过实验掌握学会使用C语言程序调用汇编语言程序的方法;(2)掌握ARMC语言程序使用汇编语言程序的方法。2实验内容(1)编写一个汇编程序,建立C语言的运行环境并进入到C语言程序;(2)用汇编语言编写具有4参数的字节数据、半字数据和字数据相加的程序,使用C语言调用。3预备知识(1)ARM系统的ATPCS规则标准。(2)ARMC语言调用汇编语言的规则。(3)ADS1.2工程编辑和AXD调试。4实验设备硬件:PC机一台。软件:Windows98/XP/2000系统,ADS1.2集成开发环境。5实验步骤(1)启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程exp14.mcp。(2)建立汇编源文件exp14_arm.s、exp14_c.c和三个汇编加法程序并命名,进行编写;然后添加到工程中。(3)设置工程连接地址ROBase为0x30000000,RWBase为0x30003000,设置调试口地址Imageentrypoint为0x30000000。设置工程的开始文件(4)编译连接工程,选择Project|Debug,启动AXD进行软件仿真调试。(5)打开寄存器窗口(ProcessorRegisters),选择Current项监视其中寄存器的值。打开存储器观察窗口(Memory),设置观察存储器操作的地址内容。(6)单步运行程序,或设置断

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论