您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 述职报告 > 汇编程序设计实验报告
合肥工业大学计算机与信息学院实验报告课程:汇编语言程序设计专业班级:计算机科学与技术08-1班学号:20082514姓名:王礼慧实验一Debug程序的使用一.实验目的1、熟悉DEBUG程序中的命令,学会在DEBUG下调试运行汇编语言源程序。2、掌握8086/8088的寻址方式及多字节数据的处理方法。二.实验内容1、利用DEBUG程序中的“E”命令,将两个多字节数“003F1AE7H”和“006BE5C4H”分别送入起始地址为DS:0200H和DS:0204H两个单元中。2、分别用直接寻址方式和寄存器间接寻址方式编写程序段,实现将DS:0200H单元和DS:0204H单元中的数据相加,并将运算结果存放在DS:0208H单元中。要求:本次实验的内容均在DEBUG下完成,实现数据的装入、修改、显示;汇编语言程序段的编辑、汇编和反汇编;程序的运行和结果检查。三.实验过程和程序1、预习实验,复习DOS启动方式和DOS有关命令的使用;看书熟悉掌握DEBUG调试程序中的A、D、E、G、Q、R、T、U命令的书写格式及功能;复习寻址方式和相关的数据传送指令及算术运算指令。2.、上机实验:1)启动操作系统2)运行DEBUG.COM程序(若当前盘为C)C:>DEBUG↙在Windows操作系统下,开始-运行-cmd-debug↙-;DEBUG提示符,仅当屏幕出现该提示符后,才可输入DEBUG命3)用“A”命令编辑和汇编源程序【直接寻址方式】–A↙0B32:0100MOVAX,[0200]↙0B32:0103MOVBX,[0202]↙0B32:0107ADDAX,[0204]↙0B32:010BADCBX,[0206]↙0B32:010FMOV[0208],AX↙0B32:0112MOV[020A],BX↙0B32:0116↙4)用“U”命令反汇编验证源程序–UCS:0100↙0B32:0100A10002MOVAX,[0200]0B32:01038B1E0202MOVBX,[0202]0B32:010703060402ADDAX,[0204]0B32:010B131E0602ADCBX,[0206]0B32:010FA30802MOV[0208],AX0B32:0112891E0A02MOV[020A],BX0B32:0116–注意:z检查源程序是否有错误,若有则返回到第3步用“A地址”命令进行修改,直到程序无错误。zDEBUG约定在其命令或源程序中所涉及到的数据均被看作十六进制数,其后不用“H”说明。z在DEBUG下,源程序中不能使用“标号”、“变量”和一些伪指令。z在DEBUG下,大小写不敏感。5)程序未执行前,用“R”命令观察,相关寄存器的内容。–R↙6)在程序未执行前,用“D”命令观察DS:0200H,DS:0204H、DS:0208H单元的内容–D20020B↙7)用“G”命令运行源程序–G=1100116↙8)再用“D”命令观察DS:0200H~DS:020BH字节单元中的内容–D20020B↙9)用“T”单步操作命令对源程序单步执行,观察AX、BX、CS、IP寄存器内容的变化,并与预计的结果相比较。注意:zD命令显示内存数据,注意观察多字节数据在内存中的存放方式。z指令执行的时候,IP寄存器随着变化,注意观察试用寄存器间接寻址方式编写程序段,完成上述程序段的功能。(参考下列程序流程图)用“A”命令编辑和汇编源程序【寄存器间接寻址方式】-A↙0B32:0100MOVSI,2000B32:0103MOVDI,2040B32:0106MOVBX,2080B32:0109MOVAX,[SI]0B32:010BMOVDX,[SI+2]0B32:010EADDAX,[DI]0B32:0110ADCDX,[DI+2]SI←200HDI←204HBX←208HAX←[SI]DX←[SI+2]AX←AX+[DI]DX←DX+[DI+2][BX]←(AX)[BX+2]←(DX)开始结束0B32:0113MOV[BX],AX0B32:0115MOV[BX+2],DX0B32:0118用“U”命令反汇编验证源程序-U↙0B32:0100BE0002MOVSI,02000B32:0103BF0402MOVDI,02040B32:0106BB0802MOVBX,02080B32:01098B04MOVAX,[SI]0B32:010B8B5402MOVDX,[SI+02]0B32:010E0305ADDAX,[DI]0B32:0110135502ADCDX,[DI+02]0B32:01138907MOV[BX],AX0B32:0115895702MOV[BX+02],DX0B32:0118-3、附加题目:1)从DS:0000H开始的5个16位带符号数分别记为x,y,z,v,w,用E命令初始化为:540,1,-1,1080,0,试求w=(v-(x*y+z-540))/x-E01C020100FFFF38040000-A0B3F:0100MOVAX,[0000]0B3F:0103MOVBX,[0002]0B3F:0107MOVDX,00B3F:010AIMULBX0B3F:010CADDAX,[0004]0B3F:0110ADCDX,00B3F:0113SUBAX,021C0B3F:0116SBBDX,00B3F:0119MOVBX,[0006]0B3F:011DMOVCX,00B3F:0120SUBBX,AX0B3F:0122SBBCX,DX0B3F:0124MOVAX,BX0B3F:0126MOVDX,CX0B3F:0128MOVBX,[0000]0B3F:012CIDIVBX0B3F:012EMOV[0008],AX0B3F:01312)完成BX中1的个数的统计。-A0B3F:0100MOVBX,12340B3F:0103XORAX,AX0B3F:0105MOVCX,160B3F:0108SHRBX,10B3F:010AADCAX,00B3F:010DLOOP01083)用串操作指令将DS:0000开始20个字节初始化为:0CCH。并将这20个字节的内容复制到其后的20个字节里。-A0B3F:0100CLD0B3F:0101MOVDI,00B3F:0104MOVAL,CC0B3F:0106MOVCX,140B3F:0109REPSTOSB0B3F:010BMOVBX,ES0B3F:010DMOVDS,BX0B3F:010FMOVSI,00B3F:0112MOVCX,140B3F:0115REPMOVSB四.实验结果(包括必要的截图)1)程序未执行前,相关寄存器的内容:(AX)=0000H,(BX)=0000H,(SI)=0000H,(DI)=0000H,(CS)=0B32H,(IP)=0100H。2)在程序未执行前,DS:0200H,DS:0204H、DS:0208H单元的内容E71A3F00C4E56B00-2EC706553)用“G”命令运行源之后用“D”命令观察DS:0200H~DS:020BH字节单元中的内容E71A3F00C4E56B00-2EC700004)用“T”单步操作命令对源程序单步执行,观察AX、BX、CS、IP寄存器内容的变化5)程序运行结果:(AX)=00ABH,(BX)=00ABHDS:0208H四字节单元的内容:00AB00ABH附加题实验结果:1)运算结果:FF892)BX的内容为1234,1的个数为53)DS:027均为CC五.实验体会经过这次试验,对于debug环境有了一个基本的了解,同时通过对指令的使用而对计算机的数据传送、算术运算、逻辑和移位操作、串操作、控制转移和循环等指令有了更深的理解和更熟悉。通过实验也发现了不少平时在看书是容易忽视,不太理解和误解的地方,例如,串操作指令是对一个一个字节进行操作的,在debug环境下,所有的控制转移和循环指令后面的操作数都可以是地址,E命令后面一定要接上地址,在debug环境下以字母开头的十六进制数前面不用加零等。总之,通过实践,使自己学到了很多。实验二汇编语言程序设计(顺序、循环)一.实验目的1、掌握顺序和循环程序结构和设计方法;2、熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程。二.实验内容1、X、Y、Z、V均为字变量,在X、Y、Z、V字单元中存放是16位带符号数。试编写汇编语言程序完成以下功能:①计算表达式值(V–(X*Y+Z-720))/X;②将上述表达式运算结果整数放在SUM1单元,余数放在SUM2单元。2、求一个班50名学生成绩的平均值(附加题:最大值和最小值,并将结果显示出来)3、从键盘读入一个字符串,以Enter结束,字符串不超过50个字符,并打印该字符串(附加题:查找中间是否有‘asm’子串。如果有,输出‘Yes’;否则,输出‘No’)。三.实验过程和程序1.分析:先定义一个数据段,包含X、Y、Z、V、SUM1和SUM2六个字单元并分别对X、Y、Z、V赋初值(程序运行的时候可以在DEBUG环境下通过E命令修改初值以实现用多组不同数据来验证程序的目的)。由于不能对两个内存数直接操作,因此,在实现过程中要借用寄存器。对于乘法指令,乘数是字类型,则被乘数默认为AX的内容,结果为(DX,AX);对于除法指令,除数是字类型,则被除数默认为(DX,AX),因此需要对被除数进行扩展,且由于前面的运算,要注意每个寄存器中内容的变换和保存,以确保运算的正确性。另外注意,X、Y、Z、V均为带符号数,则使用IMUL和IDIV指令。将结果的整数部分放在SUM1单元中,余数放在SUM2单元中,退出DOS。注意汇编程序设计的格式和指令格式,还有在asm文本中数默认是10进制,而在DEBUG环境中所有的数都默认是十六进制的,注意区别。程序流程图如下所示AX←DATADS←AXAX←(X)DX,AX←(AX)*(Y)AX←(AX)+(Z)DX←(DX)+CFAX←(AX)-720DX←(DX)-CFBX←(AX)CX←(DX)DX,AX←(V)AX←(AX)-(BX)DX←(DX)-(CX)-CFAX←(DX,AX)/(X)商DX←(DX,AX)/(X)余数结束SUM1←(AX)SUM2←(DX)AH←4CHINT21H开始源程序datasegmentXdw1234HYdw1212HZdw3456HVdw5678HSUM1dw?SUM2dw?dataendscodesegmentassumecs:code,ds:datastart:MOVAX,dataMOVDS,AXMOVAX,XIMULY;有符号数X*Y,乘积存放在(DX,AX)ADDAX,Z;X*Y+ZADCDX,0SUBAX,720;X*Y+Z-720,720也就是02D0HSBBDX,0MOVBX,AXMOVCX,DXMOVAX,VCWDSUBAX,BXSBBDX,CXIDIVX;(V-(X*Y+Z-720))/X,MOVSUM1,AX;把表达是运算结果的整数存放在SUM1单元MOVSUM2,DX;把表达是运算结果的部分存放在SUM2单元movah,4chint21hcodeendsendstart上机操作:用记事本编写好源程序将其另存为.ASM格式,然后用调试并改进直至正确无误,生成.OBJ和.EXE文件并运行,观察并记录结果,于预期结果作比较。2.分析:首先定义一个数据段,包含50个学生的成绩score(可使用DUP赋初值)、平均值average,最大值max和最小值min,均为无符号数字节数。对于求平均值,先用循环计算出50个学生的成绩总和,再除以50即得。对于求最大值也用循环,先将第一个学生的成绩放入AX中,再用AX依次与后面的49个学生的成绩作比较,遇到大的即交换,否则不变,如此当所有的成绩都比较完之后,AL中存放的即是最大值,将其放在MAX中。再求最大致的过程中需用到两层循环,因此要注意在上一层循环后面要加一条jcxz指令跳到下一层循环后面,否则,如果循环在上一层结束,(c
本文标题:汇编程序设计实验报告
链接地址:https://www.777doc.com/doc-3297336 .html