第1页/共15页《汇编语言程序设计》实验报告实验名循环、分支、子程序设计实验室实验楼实验日期2014-06-09一、实验目的及要求1.熟悉命令格式,功能,加强对指令系统的理解2.编写简单循环、选择、子程序的结构程序3.单步跟踪调试,观察寄存器的变化和指令执行的结果二、实验环境硬件环境:一台微型计算机软件环境:windowsxp,debug环境,masm三、实验内容(至少写3个程序)题目一:编写程序,求三个数据中的最大值,并将最大值存入MAX字单元中。1.设计:将x存入ax中,先与y比较,当x大时,x仍存于ax中,再与z比较,如果x大,则将x存入max中;否则将z存入max中。当y大时,将y存入ax中,覆盖较小的x后,与z比较,得出最大数存于max中。2.源程序清单datasegmentxdw1ahydw0ahzdw01hmaxdw?dataends;数据段定义codesegmentassumeds:data,cs:codestart:movax,datamovds,ax;初始化数据段movax,xcmpax,yjgl1;判断x是否大于y,如果x大,则程序跳转到l1;否则顺序执行第2页/共15页movax,yjgexitl2:movax,zjmpexitl1:cmpax,z;判断x是否大于z,若z大时,则跳转至l2;否则顺序执行exit段程序jlel2exit:movmax,axmovah,4chint21h;将最大值存于max中codeendsendstart3.调试过程:(1).用masm程序产生mwn4.obj文件,没有错误,如下图:(2).用link程序产生mwn4.exe文件,如下图:(3).用u命令反汇编,查看代码段,数据段所在的内存单元;第3页/共15页(4).查看数据段初始数据:(5).初始化数据段(6).x和y比较得:x大于y,将x存入AX中;(7).x和z比较:x大于z,仍存于AX中;第4页/共15页(8).输出运行结果:在数据段进行查看,max预先申请的内存单元[0004]中,存放着x的值。题目二:设有十个学生的成绩分别是76,69,84,90,73,88,99,63,100和80分。编制一个子程序统计60~69分,70~79分,80~89分,90~99分,和100分的人数,并分别存放到S6,S7,S8,S9,S10单元中。1.设计:分别为十个成绩、成绩总个数、分段的5个区间申请内存单元,初始化数据段;将AX,BX,CX压栈,保留原始数据。选取第一个成绩,存入AX中,该数据除以10,得到商存入BX,判断商的所属区间,给所属区间加1,继续下一个,循环直到十个全部判断结束,pop出栈,得到属于各区间的成绩个数,程序结束。2.源程序清单dsegsegment;数据段定义numdw76,69,84,90,73,88,99,63,100,80;十个成绩分别存入num为首地址的10个内存单元ndw10s6dw0s7dw0s8dw0s9dw0第5页/共15页s10dw0;n=10,n是数据总数,S6~S10分别存储不同成绩段的个数dsegendscodesegment;代码段定义mainprocfarassumecs:code,ds:dsegstart:pushdssubax,axpushaxmovax,dsegmovds,ax;初始化数据段callsub1retmainendpsub1procnear;sub1子程序pushaxpushbxpushcxpushsi;分别将AX,BX,CX,SI压栈,保留数据movsi,0movcx,n;CX赋值为10,数据总数next:movax,num[si];选中第一个数据,存入AX中movbx,10divblmovbl,al;该数据除以10后将商存入BLcbwsubbx,6;减去6,判断是否为有效的数据范围salbx,1incs6[bx]第6页/共15页addsi,2loopnext;得到第一个数为S6区间,S6加1,继续下一个内存单元的数据,直到十个数据都判断结束popsipopcxpopbxpopaxret;将保留的数据出栈sub1endp;子程序结束codeendsendstart;程序结束3.调试过程:(1).用masm程序产生mwn5.obj文件,没有错误,如下图:(2).用link程序产生mwn5.exe文件,如下图:(3).用u命令反汇编,查看代码段,数据段所在的内存单元;第7页/共15页(4).查看数据段,初始存入的十个成绩[0000]~[0011]段,[0012]存的数据总数10,而S6~S10这五个内存单元全是0,为申请占用的空间。(5).初始数据段第8页/共15页(6).分别将AX,BX,CX,SI压栈,保留初始数据,(7).先选中第一个成绩,将BX赋值10,除以该成绩,将商存于BL;第9页/共15页(8).用商减去6得到的差,存于BX并逻辑左移一位;(9)将BX置1后,加1继续循环,知道BX为10,循环结束;(10)循环结束,在数据段查看结果,如下图,[0013]=2,[0014]=2,[0015]=3,[0016]=2,[0017]=1,分别对应不同成绩段的个数。题目三:编写一个程序:从键盘输入一行字符,要求低一个键入的字符必须是空格,如不是,则退出程序;如是,则开始接受键入的字符并顺序存放在首地址为BUFFER的缓冲区中(空格符不存入),直接接收到第二个空格符时退出程序。1.设计:先预申请足够的以buffer为首地址的内存单元,设置一个标志变量来判断输入的字符个数。先输入一个字符,判断是否为空格键,如果是,则程序继续进行,并将之后输入的非空格的字符串存入申请的内存单元,直到再一次输入的为空格为止;如果不是,则结束程序。第10页/共15页2.源程序清单datareasegment;定义数据段bufferdb80dup(?);预申请了以buffer为首地址的内存单元flagdb?datareaendsprognamsegment;定义编码段mainprocfarassumecs:prognam,ds:datareastart:pushds;保存原始数据subax,ax;把0拖入ax中pushax;存到堆栈中movax,datarea;datarea段地址movds,ax;存入DS寄存器中leabx,buffer;将buffer首地址存入BXmovflag,0;flag清零next:movah,01hint21h;输入字符testflag,01hjnzfollow;不为0时,跳转;否则顺序执行cmpal,20hjnzexit;和空格键比较,判断是否输入的字符是空格键,如果不是,则跳转,否则顺序执行movflag,1jmpnext;跳转到next段程序执行follow:cmpal,20hjzexit;如果为0,则跳转到exit,否则顺序执行mov[bx],al;将AL的值存入BX所指的内存单元第11页/共15页incbxjmpnext;继续判断下一个输入的字符exit:ret;返回dosmainendpprognamendsendstart;程序结束3.调试过程:(1).用masm程序产生mwn6.obj文件,没有错误,如下图:(2).用link程序产生mwn6.exe文件,如下图:(3).用u命令反汇编,查看代码段,数据段所在的内存单元;第12页/共15页(4).查看数据段,初始全零;(5).初始化数据段,并保留AX、BX、CX的值;(6).准备存储单元;第13页/共15页(7).直接输入字符“r”;(8).第一个输出结果,由于直接输入字符,不符合输入规则,因此不存入内存单元,如下图:(9).先输入空格,符合继续写入的条件;第14页/共15页(10).输入第一个字符“0”;(11)输入第二个字符“K”;(12)再次输入空格,结束字符串的写入;第15页/共15页(13).输出结果“0k”,查看内存单元,如下图:四、总结