实验一汇编语言编程基础一.上机目的:了解并逐步熟悉汇编语言的编辑方法及特点.复习8088汇编语言的段结构、常用的指令与伪指令、存储空间的分配等。掌握汇编语言的编辑、汇编及连接的过程。了解并逐步掌握运用DEBUG进行调试汇编语言程序。二.实验内容:学习汇编语言程序的上机步骤1.编辑EDIT.COM2.用汇编程序MASM.Exe对源程序.ASM文件汇编,生成目标文件.OBJ3.连接LINK.EXE4.运行和调试DEBUG.exe熟悉、使用DEBUG调试工具运用8086汇编语言,编辑多字节非压缩型BCD数除法的简单程序,文件名取为*.ASM。运用MASM﹒EXE文件进行汇编,修改程序中的各种语法错误,直至正确,形成*.OBJ文件。运用LINK.EXE文件进行连接,形成*.EXE文件。仔细阅读和体会DEBUG调试方法,掌握各种命令的使用方法。运用DEBUG。EXE文件进行调试,使用单步执行命令—T两次,观察寄存器中内容的变化,使用察看存储器数据段命令—D,观察存储器数据段内数值。再使用连续执行命令—G,执行程序,检查结果是否正确,若不正确可使用DEBUG的设置断点,单步执行等功能发现错误所在并加以改正。三.正确的程序清单datasegmentadb9,6,8,7,5bdb5cdb5dup(0);5之后有空格nequ5dataendscodesegmentassumecs:code,ds:data,es:data;是逗号不是分号最后不应有标点start:movax,data;start后面应该有冒号movds,axmoves,axcldleasi,aleadi,c;lea不是lebmovcx,nmovah,0lp1:lodsbaaddivbstosblooplp1movcx,nleadi,clp2:movdl,[di]adddl,30h;加30对应正确的ASCII码movah,2int21hincdi;地址应该递增而不是递减looplp2movah,4chint21hcodeends;没有冒号endstart程序框图如下实验结果如下实验2.1简单程序设计一.实验目的理解各种指令的功能。进一步学习程序的调试。二.实验内容练习1.实验题目:编程计算下列表达式:A=90,B=-70,C=5,Y均为有符号数,计算Y=2×(A+B)+(A×C)÷5原程序DATASEGMENTADB90D,-70D,90D,5DBDB2CDB5DDB10DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVSI,OFFSETAMOVBL,[SI];90D进BLINCSIADDBL,[SI];-70D加入BLXORAX,AX;AX清零MOVAL,BL;结果存入ALMULB;AL乘2MOVBL,AL;结果存到BLINCSIMOVAL,[SI]INCSIMULBYTEPTR[SI];90D乘5DDIVC;AL除以5ADDBL,AL;两个结果相加,结果存BLMOVAL,BL;转移到ALDIVD;除以10MOVCL,AH;余数存CLDIVD;再除以10MOVDL,AL;商转移到DL准备输出到屏幕ADDDL,30H;调整ACSII码MOVBL,AH;余数存到BLMOVAH,2;输出百位INT21HMOVDL,BLADDDL,30HMOVAH,2;输出十位INT21HMOVDL,CLADDDL,30HMOVAH,2;输出个位INT21HCODEENDSENDSTART输出计算结果130练习3.编制程序,从键盘输入最多5个数,求他们的和,存入SUM。datasegmentadb5dup(?)bdb10dataendscodesegmentassumecs:code,ds:datastart:movax,datamovds,axmovcx,5leasi,axordl,dllop1:xorax,axmovah,01;从键盘输入数字int21hadddl,alsubdl,30h;ASCII码转换为实际数值looplop1;循环5次输入五个一位数adddl,30h;转换为ASCII码准备输出cmpdl,3Ah;比较和是否大于9jael1;大于进入l1jmpl2;不大于进入l2l1:moval,dlxorah,ahsubal,30hdivbyteptrb;与练习一同理,除以10,商是十位,余数是个位movdl,aladddl,30hmovbl,ahmovah,2int21hmovdl,bladddl,30hl2:movah,2;直接向屏幕输出结果int21hcodeendsendstart输入11111输出连加计算结果5输入23456输出连加计算结果20实验2.2汇编语言程序设计----循环结构程序一.实验内容练习1.用“冒泡“法对一组数300,250,280,240,260,按从小到大的顺序排列。提示:用冒泡的方法对一组数据元素排序,它的基本方法是:将相邻的两个元素通过比较进行排序,通过多次,多遍的邻元素排序,实现整个一组数的排序。对于5(N)个元素,整个排序通过4遍(=N-1)邻元素排序完成。每一遍的排序由若干次邻元素的排序组成。4遍排序中,邻元素的排序依次为4,3,2,1遍。完成第一遍排序后,最大数沉底,已经到达它应占据的位置,不需要参加下一遍的排序。外循环的次数为CX=4次(N-1),内循环的次数为4,3,2,1(DECCX)排序遍数本遍排序前第一次排序后第二次排序后第三次排序后第四次排序后1300,250,280,240,260250,300,280,240,260250,280,300,240,260250,280,240,300,260250,280,240,260,3002250,280,240,260,300250,280,240,260,300250,240,280,260,300250,240,260,280,3003250,240,260,280,300250,240,260,280,300240,250,260,280,3004240,250,260,280,300240,250,260,280,300二.程序清单DATASEGMENTADW300,250,280,240,260BDW5DUP(?)DDB10DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXXORAX,AXXORBX,BXMOVCX,5LEASI,ALOP33:MOVAX,[SI];LOP33内的循环是将A内的5个数输出到屏幕上,与实验2.1练习一中程序同理DIVD;将三个数通过除法取出转换为ASCII码然后输出MOVBH,AHDIVDMOVDL,ALADDDL,30HMOVBL,AHMOVAH,2INT21HMOVDL,BLADDDL,30HMOVAH,2INT21HMOVDL,BHADDDL,30HMOVAH,2INT21HMOVDL,20HMOVAH,2INT21HINCSIINCSILOOPLOP33MOVDX,5;外循环5次MOVCX,5LOPP:LEASI,ADECDXMOVCX,DXLOP:MOVAX,[SI];取第一个数MOVBX,[SI+2];取第二个数CMPAX,BXJAELOP1;第一个数大于第二个数则进入LOP1JMPLOP2;不大于则挑过LOP1进入LOP2LOP1:MOV[SI+2],AX;LOP1用于两数互换位置MOV[SI],BXLOP2:INCSIINCSICMPDX,0;如果外循环了5次则进入LOP4JZLOP4LOOPLOP;内循环LOOPLOPP;外循环LOP4:MOVCX,5LEASI,ALOP3:MOVAX,[SI];LOP3中的循环是将排序过后的五个三位数输出,与实验2.1练习一中程序同理DIVDMOVBH,AHDIVDMOVDL,ALADDDL,30HMOVBL,AHMOVAH,2INT21HMOVDL,BLADDDL,30HMOVAH,2INT21HMOVDL,BHADDDL,30HMOVAH,2INT21HMOVDL,20HMOVAH,2INT21HINCSIINCSILOOPLOP3MOVAH,4CHINT21HCODEENDSENDSTART第三次实验8253定时器/计数器与接口实验------乐曲程序一.实验目的:学习8253计数器2输出方波信号用以驱动扬声器发声的原理,通过程序设置计数器2的输出波形的频率和延续时间,控制扬声器的音调和发生长短。二.实验内容:1.设计程序让微机演奏一段两只老虎的乐曲。2.思考如何让PC机演奏一遍,两遍以及数遍这段两只老虎的乐曲,并修改程序实现。三.程序清单stacksegmentstackdw100dup(?)stackendsdatasegmentmusicdw2dup(262,294,330,262)dw2dup(330,349,392)dw2dup(392,440,392,349,330,262)dw2dup(294,196,262),0timedw10dup(250*50),500*50,250*50,250*50,500*50dw2dup(120*50,120*50,120*50,120*50,250*50,250*50)dw2dup(250*50,250*50,500*50)nequ32dataendscodesegmentassumecs:code;ds:datastart:movax,datamovds,axmoval,0b6h;控制字写入控制器out43h,alleadi,music;分别取music和time地址送入DI,SIleasi,timemovcx,n;循环32次将乐曲的32个音符完成lp:movbx,[di];读出频率adddi,2;指向下一个频率movdx,12h;将脉冲频率存入AX,DXmovax,34dchdivbx;算出计数值out42h,almoval,ahout42h,al;计数值给到计数器2inal,61horal,3out61h,al;开扬声器movdx,[si];将时长存入DXaddsi,2movbx,cxdel1:movcx,064h;延时del2:loopdel2decdx;循环中继续延时jnzdel1movcx,bxinal,61handal,0fchout61h,al;关扬声器looplp;回到lp准备发出下一个音符movah,4chint21hcodeendsendstart四.实验结果扬声器发出两只老虎的音乐反汇编和单步运行实验1心得体会将源程序打入记事本中,存为asm文件,用masm汇编以后报5个错。通过行数检查发现一些格式错误和指令错误,这些错误都不难发现。错误都在正确程序中标注出。改正过之后程序正常运行,但最终结果错误,说明还有逻辑错误。在了解了程序流程图,掌握了解决问题的逻辑顺序后开始读程序,并用debug里面的T命令一步一步看程序执行的结果,发现lp2循环中dl在第一次循环中输出正确后之后均是错误输出。注意到之前有leadi,c语句将DI地址恢复,于是发现DECDI错误,应该是递增而不是递减。这样修改之后程序仍未得到正确的结果。发现结果对应ASCII码输出,于是将DL加30H,最终输出正确结果。实验2.1心得体会在练习1中,通过汇编发现MUL不能用立即数。练习1中的计算编程比较简单,只是要求输出在屏幕上的话,就需要将十六进制的结果转化为十进制然后一位一位输出出来。本程序使用将十六进制结果除以十得到的商和余数转化为ASCII码后输出。三位数使用了两次除法,将两次除法的商和最后的余数输出,得到正确结果。练习3中我将基础的五个一位数加法,和的上线为9的程序改进到能够正确输出两位数和。一开始和的上线为9是因为虽然程序能够计算出正确结果,但输出时转变为ASCII码,只能正确输出十进制一位,超过一位的会输出其他字符。经过改进的程序能够输出一位数或两位数的和。这是因为程序中首先使