合肥工业大学计算机与信息学院实验报告课程:汇编语言程序设计专业班级:学号:姓名:实验一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操作系统2、运行DEBUG.COM程序(若当前盘为C)C:>DEBUG↙–;(“–”为DEBUG提示符,仅当屏幕出现该提示符后,才可输入DEBUG命令)3、用“A”命令编辑和汇编源程序–A↙186E:0100MOVAX,[0200]↙186E:0103MOVBX,[0202]↙186E:0107ADDAX,[0204]↙186E:010BADCBX,[0206]↙186E:010FMOV[0208],AX↙186E:0112MOV[020A],BX↙186E:0116↙4、用“U”命令反汇编验证源程序–UCS:0100↙186E:0100A10002MOVAX,[0200]186E:01038B1E0202MOVBX,[0202]186E:010703060402ADDAX,[0204]186E:010B131E0602ADCBX,[0206]186E:010FA30802MOV[0208],AX186E:0112891E0A02MOV[020A],BX186E:0116–注意:检查源程序是否有错误,若有则返回到第3步用“A地址”命令进行修改,直到程序无错误。DEBUG约定在其命令或源程序中所涉及到的数据均被看作十六进制数,其后不用“H”说明。在DEBUG下,源程序中不能使用“标号”、“变量”和一些伪指令。在DEBUG下,大小写不敏感。5、程序未执行前,用“R”命令观察,相关寄存器的内容。–R↙如:(AX)=0000H,(BX)=0000H,(SI)=0000H,(DI)=0000H,(CS)=0B32H,(IP)=0100H。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寄存器内容的变化,并与预计的结果相比较。注意:D命令显示内存数据,注意观察多字节数据在内存中的存放方式。指令执行的时候,IP寄存器随着变化,注意观察。1、程序运行结果:(AX)=00ABH,(BX)=00ABHDS:0208H四字节单元的内容:00AB00ABH2、试用寄存器间接寻址方式编写程序段,完成上述程序段的功能。(参考下列程序流程图)3、附加题目:1.从DS:0000H开始的5个16位带符号数分别记为x,y,z,v,w,用E命令初始化为:540,1,-1,1080,0,试求w=(v-(x*y+z-540))/x2.完成BX中1的个数的统计。SI←200HDI←204HBX←208HAX←[SI]DX←[SI+2]AX←AX+[DI]DX←DX+[DI+2][BX]←(AX)[BX+2]←(DX)开始结束3.用串操作指令将DS:0000开始20个字节初始化为:0CCH。并将这20个字节的内容复制到其后的20个字节里。cld四.实验体会通过这次试验,对于debug环境有了一个基本的了解,同时通过对指令的使用而对计算机的数据传送、算术运算、逻辑和移位操作、串操作、控制转移和循环等指令有了更深的理解。串操作指令是对一个一个字节进行操作的。实验二汇编语言程序设计(顺序、循环)一.实验目的1、掌握顺序和循环程序结构和设计方法;2、熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程。二.实验内容1、X、Y、Z、V均为字变量,在X、Y、Z、V字单元中存放是16位带符号数。试编写汇编语言程序完成以下功能:①计算表达式值(V–(X*Y+Z-720))/X;②将上述表达式运算结果整数放在SUM1单元,余数放在SUM2单元。dsegsegmentxdw2ydw360zdw0vdw5sum1dw?sum2dw?dsegendscsegsegmentassumecs:cseg,ds:dsegstart:movax,dsegmovds,axmovax,xmovbx,ymulbxmovbx,zaddax,bxsubax,2d0hmovbx,vsubbx,axmovax,bxcbwmovbx,xdivbxmovsum1,axmovsum2,dxmovah,4chint21hcsegendsendstart2、求一个班50名学生成绩的平均值(附加题:最大值和最小值,并将结果显示出来)dsegsegmentscoredb10dup(80,70,60,90,90)avgdb?maxdb0dh,0ah,?mindb0dh,0ah,?dsegendscsegsegmentassumecs:cseg,ds:dsegstart:movax,dsegmovds,axmovcx,50movax,0movbh,0movbl,100movsi,0l:addal,score[si]adcah,0incsilooplmovdx,sidivdlmovavg,almovcx,50movsi,0l1:cmpscore[si],bhjbes1movbh,score[si]s1:incsiloopl1movcx,50movsi,0l2:cmpscore[si],bljas2movbl,score[si]s2:incsiloopl2moval,blmovah,0movcl,10divclcmpal,0jzgw1cmpal,10jzmf1movch,ahaddal,30hmovdl,almovah,2int21haddch,30hmovdl,chmovah,2int21hjmpdone1gw1:movdl,ahadddl,30hmovah,2int21hjmpdone1mf1:movdl,31hmovah,2int21hmovdl,30hmovah,2int21hmovdl,30hmovah,2int21hdone1:movdl,0dhmovah,2int21hmovdl,0ahmovah,2int21hmoval,bhmovah,0movcl,10divclcmpal,0jzgwcmpal,10jzmfmovch,ahaddal,30hmovdl,almovah,2int21haddch,30hmovdl,chmovah,2int21hjmpdonegw:movdl,ahadddl,30hmovah,2int21hjmpdonemf:movdl,31hmovah,2int21hmovdl,30hmovah,2int21hmovdl,30hmovah,2int21hdone:movah,4chint21hcsegendsendstart3、从键盘读入一个字符串,以Enter结束,字符串不超过50个字符,并打印该字符串(附加题:查找中间是否有‘asm’子串。如果有,输出‘Yes’;否则,输出‘No’)。datasegments1db51,?,51dup('$')s3db0ah,0dh,'Yes$'s4db0ah,0dh,'No$'dataendsdsegsegments2db'asm'dsegendscsegsegmentassumecs:cseg,ds:data,es:dsegstart:movax,datamovds,axmovax,dsegmoves,axleadx,s1movah,0ahint21hmovdl,0dhmovah,2int21hmovdl,0ahmovah,2int21hleadx,s1+2movah,9int21hmovcl,s1+1cmpcl,3jbnotfoundleasi,s1leadi,s2movdx,simovbx,dimovah,48cldagain:movcx,3repzcmpsbjzfoundadddx,1movsi,dxmovdi,bxdecahjnzagainjmpnotfoundjmpoverfound:leadx,s3movah,9int21hjmpovernotfound:leadx,s4movah,9int21hover:movah,4chint21hcsegendsendstart三.实验体会通这次试验,熟悉了MASM汇编环境和汇编程序设计的格式,熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程。同时对顺序和循环程序设计更加熟练,并在编程过程中熟悉了算术运算、位操作和串操作等指令。算术运算中,对于不同类型数进行运算时,要进行扩展,还有不要忽视进位;对于循环和控制转移指令,如果有多个循环或转移指令,则前一个循环或转移结束后,一定到无条件转移到结尾处;串操作指令中,源串和目的串分别定义在DS和ES两个段中的,不能对ES进行段超越操作等。实验三汇编语言子程序设计(分支、子程序)一.实验目的1、掌握分支和子程序结构和设计方法;2、熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程。3、通过汇编语言了解高级语言的参数传递等知识。二.实验内容1、1.BL中的只有一位为1。编写程序测试,并输出提示信息“TheXBitis1”,要求:地址表和转移表。dsegsegmentadb2msg0db0dh,0ah,'The0Bitis1','$'msg1db0dh,0ah,'The1Bitis1','$'msg2db0dh,0ah,'The2Bitis1','$'msg3db0dh,0ah,'The3Bitis1','$'msg4db0dh,0ah,'The4Bitis1','$'msg5db0dh,0ah,'The5Bitis1','$'msg6db0dh,0ah,'The6Bitis1','$'msg7db0dh,0ah,'The7Bitis1','$'addrtb1dwfunc0,func1,func2,func3,func4,func5,func6,func7dsegendscsegsegmentassumecs:cseg,ds:dsegstart:movax,dsegmovds,axmovcx,8movsi,0movbl,acmpbl,0jzexitl:shrbl,1jcl1incsiloopljmpexitl1:movax,siandax,0fhshlax,1movbx,axjmpaddrtb1[bx]func0:leadx,msg0jmpoutputfunc1:leadx,msg1jmpoutputfunc2:leadx,msg2jmpoutputfunc3:leadx,msg3jmpoutputfunc4:leadx,msg4jmpoutputfunc5:leadx,msg5jmpoutputfunc6:leadx,msg6jmpoutputfunc7:leadx,msg7jmpoutputoutput:movah,9int21hexit:movah,4chint21hcsegendsendstartdsegsegmentadb8msg0db0dh,0ah,'The0Bitis1','$'msg1db0dh,0ah,'The1Bitis1','$'msg2db0dh