您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 述职报告 > 实验3—汇编指令调试
西安邮电大学(计算机学院)课内实验报告实验名称:汇编程序调试2专业名称:光信息科学与技术班级:1103学生姓名:李群学号(8位):05113006指导教师:蒋励实验日期:2014年04月15日一.实验目的及实验环境⒈理解各种寻址方式。⒉巩固汇编上机过程:编辑源程序、编译、连接、调试。⒊掌握ARM乘法指令的使用方法。⒋了解子程序编写及调试。实验环境:XP2000系统,ADS1.2集成开发环境。二.实验内容⒈使用MOV和MVN指令访问ARM通用寄存器。⒉使用ADD、SUB、AND、ORR、CMP和TST等指令完成数据加减运算及逻辑运算。⒊使用MOV和ADD指令实现:R8=R3=X+Y。⒋使用MOV、MVN和SUB指令实现:R5=0x5FFFFFF8–R88。⒌使用CMP指令判断(5Y/2)(2X),若大于,则R5=R5&0xFFFF0000,否则R5=R5|0x000000FF。⒍使用TST指令测试R5的BIT23是否为1,若是则将BIT6位清0(使用BIC指令)。⒎使用STMFD/LDMFD、MUL指令编写一个整数乘方的子程序,然后使用BL指令调用子程序计算的Xn值。三.方案设计实验步骤:⒈创建工程,添加源文件,编辑源代码启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程Project3。建立汇编源文件TEST3.S,编写实验程序,然后添加到工程中。⒉链接选项配置设置工程链接地址ROBase为0x40000000,RWBase0x40003000,设置调试入口地址Imageentrypoint为0x40000000。⒊编译链接工程选择Project-〉Debug,启动AXD进行软件仿真调试。打开寄存器窗口(ProcessorRegisters),选择Current项监视各寄存器的值。⒋调试工程单步运行程序,观察寄存器值的变化。⑴R8=R3=X+Y单步调试窗口如下图1⑵R5=0x5FFFFFF8–R8*8调试窗口:图2⒌计算Xn:①建立工程,编辑源文件启动ADS1.2,使用ARMExecutableImage工程模板建立一个工程Project4建立汇编源文件TEST4.S,编写实验程序,然后添加到工程中。②编译链接工程配置工程链接地址ROBase为0x40000000,RWBase为0x40003000。设置调试入口地址Imageentrypoint为0x40000000③调试程序选择Project-〉Debug,启动AXD进行软件仿真调试。打开寄存器窗口(ProcessorRegisters),选择Current项监视寄存器R0、R1、R13(SP)和R14(LR)的值。打开存储器观察窗口(Memory)设置观察地址为0x40003EA0,显示方式Size为32Bit,监视从0x40003F00起始的满递减堆栈区。单步运行程序,跟踪程序执行的流程,观察寄存器值的变化和堆栈区的数据变化,判断执行结果是否正确。调试程序时,更改参数X和n来测试程序,观察是否得到正确的结果。例如,先复位程序(选择File-〉ReloadCurrentImage),接着单步执行到“BLPOW”指令,在寄存器窗口中将R0和R1的值进行修改,然后继续运行程序。四.测试数据及运行结果⒈R8=R3=X+Y实验结果由图1结合程序可以得出R8=R3=11+8=19;⒉R5=0x5FFFFFF8–R8*8实验结果:R5=0x5fffff60⒊寻址方式:在程序后已注释AREATEST2_1,CODE,READONLYENTRYCODE32STARTLDRR4,=0x40003000;存储器访问地址LDRR13,=0x40003040;堆栈初始地址MOVR0,#0x0f100;立即数寻址MOVR2,#10MOVR1,R0;寄存器寻址ADDR0,R1,R2STRR0,[R4];寄存器间接LDRR3,[R4]MOVR0,R1,LSL#1;寄存器移位STRR0,[R4,#4];基址变址LDRR3,[R4,#4]!STMIAR4!,{R0-R3};多寄存器寻址LDMIAR4!,{R5,R6,R7,R8}STMFDR13!,{R5,R6,R7,R8};堆栈寻址LDMFDR13!,{R1-R4}BSTART;相对寻址END⒋使用CMP以及TST指令:在程序清单中注释XEQU11;定义X的值为11YEQU8;定义Y的值为8BIT23EQU(123);定义BIT23的值为0x00800000AREAExample3,CODE,READONLY;声明代码段Example3ENTRY;标识程序入口CODE32;声明32位ARM指令START;使用MOV和ADD指令实现:R8=R3=X+YMOVR0,#X;X的值传入R0,X的值必须是8位图数据MOVR1,#Y;Y的值传入R0,Y的值必须是8位图数据ADDR3,R0,R1;R3=R0+R1=X+YMOVR8,R3;将R3的值传入R8;使用MOV、MVN和SUB指令实现:R5=0x5FFFFFF8–R8*8MVNR0,#0xA0000007;0xA0000007的反码为0x5FFFFFF8SUBR5,R0,R8,LSL#3;R8左移3位,结果即是R8*8;使用CMP指令判断(5*X)吗?若大于,则R5=R5&0xFFFF0000,否则R5=R5|0x000000FFMOVR0,#YADDR0,R0,R0,LSL#2;计算R0=Y+4*Y=5*YMOVR0,R0,LSR#1;计算R0=5*Y/2MOVR1,#XMOVR1,R1,LSL#1;计算R1=2*XCMPR0,R1;比较R0和R1,即(5*Y/2)(2*X)进行比较LDRHIR2,=0xFFFF0000;若(5*Y/2)(2*X),则R2=0xFFFF0000ANDHIR5,R5,R2;若(5*Y/2)(2*X),则R5=R5&R2ORRLSR5,R5,#0x000000ff;若(5*Y/2)=(2*X),则R5=R5|0x000000ff;使用TST指令测试R5的BIT23是否为1,若是则将BIT6位清0(使用BIC指令)TSTR5,#BIT23BICNER5,R5,#0x00000040BSTARTEND⒌计算XnX=X*X*X*·····X,其中相乘的X的个数为n。先将X的值装入R0和R1,使用寄存器R2进行计数,循环n-1次R1,运算结果保存在R0中。(不考虑结果溢出问题)XEQU9;定义X的值为9nEQU8;定义Y的值为8AREAExample4,CODE,READONLY;声明代码段Example4ENTRY;标识程序入口CODE32;声明32位ARM指令STARTLDRSP,=0x40003F00;设置堆栈(满递减堆栈,使用STMFD/LMDFD指令)LDRR0,=XLDRR1,=nBLPOW;调用子程序POW,返回值为R0HALTBHALTPOWSTMFDSP!,{R1-R12,LR};寄存器入栈保护MOVSR2,R1;将指数值复制到R2,并影响条件标志MOVEQR0,#1;若指数为0,则设置R0=1BEQPOW_END;若指数为0,则返回CMPR2,#1BEQPOW_END;若指数为1,则返回(此时R0没有被更改)MOVR1,R0;设置DO_MUL子程序的入口参数R0和R1SUBR2,R2,#1;计数器R2=指数值减1POW_L1BLDO_MUL;调用DO_MUL子程序,R0SUBSR2,R2,#1;每循环一次,计数器R2减1BNEPOW_L1;若计数器R2不为0,跳转到POW_L1POW_ENDLDMFDSP!,{R1-R12,PC};寄存器出栈,返回DO_MULMULR0,R1,R0;R0MOVPC,LR;返回END五.总结本次实验主要是加深对寻址方式的使用,通过大量,较为复杂的使用,在对程序进行逻辑运算编写完调试时,观测寄存器的值的变化,以此来判断程序的逻辑是否正确,达到检验程序逻辑错误的目的。六.附录:源代码(电子版)程序在四中已经编写分析,这里就不再赘述。
本文标题:实验3—汇编指令调试
链接地址:https://www.777doc.com/doc-2500181 .html