• 402.78 KB
  • 2022-04-22 11:38:17 发布

《汇编语言程序设计》习题解答及课程实验、设计辅导.pdf

  • 100页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'实验一汇编程序的汇编及运行1.实验目的(1)熟悉汇编程序的汇编、连接、执行过程;(2)生成LST文件,查看LST文件;(3)生成OBJ文件,修改语法错误;(4)生成EXE文件;(5)执行程序。2.实验涉及知识汇编程序从编写到执行的过程编程→.ASM→编译→.OBJ→连接→.EXE→加载→内存中的程序→执行1)编写源程序用EDIT或记事本输入各段,并存储成源程序(保存在MASM目录下),扩展名为ASM。2)对源程序进行汇编、连接操作如下:(1)在DOS状态下,进入MASM目录;(2)输入命令:MASM文件名(连同扩展名);(3)在系统出现的提示中输入:objectfilename[.obj]:按回车键。Sourcelistling[nul.lst]:输入:文件主名,生成lst文件,也可以不生成,直接按回车键。Lst文件用于查看编译为目标文件的过程中产生的中间结果。Cross-reference[nul.crf]:按回车键。(4)如果系统没有提示出错,那么编译过程就完成了。如果提示错误则应用edit打开源文件进行修改,然后再重复2和3步骤(5)输入:link文件主名(不要输扩展名,也可以输入扩展名.obj)runfile[.exe]:按回车键。Listfile[nul.map]:按回车键。Libraries[.lib]:按回车键。(6)没有提示错误,汇编过程就结束了,产生了exe可执行文件。如果出现‘nostrack1 segment’的错误警告,不用理会。3)执行程序(由DOS中的COMMAND命令将文件加载入内存)在DOS提示符下直接输入文件主名就可以执行文件了。程序执行后,有的会显示结果,有的可能执行后什么结果都没有,是因为程序中没有显示命令。3.实验内容1)将下面的数据段输入,取名1.ASM,保存在MASM文件夹下。生成LST文件,(不必连接、运行)用EDIT查看1.LST文件。试回答:DA1,DA2的偏移量分别是多少?COUNT的值为多少?DATASEGMENTORG20HNUM1=9NUM2=NUM1+10HDA1DB"TinkpadPC"DB0AH,0DHCOUNTEQU$-DA1DATAENDSENDCount000CDA100202 2)输入下面错误的文件,修改错误语句。(MASM没有出现错误即可。不必连接、运行。)将VAR3DB’ABCDEF’改为VAR3DB"ABCDEF"正确代码:DATASEGMENTVAR1DB0,25,0DH,255VAR2DB12H,04H,6BHVAR3DB"ABCDEF"VAR4DW1234H,5678HVAR5DW10HDUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEASI,VAR5MOVBX,OFFSETVAR2MOVAX,0ABHMOV[SI],AXMOVAL,VAR1+23 MOVAX,[SI]MOV[BX],AXMOVAX,VAR4MOVVAR5+4,AXMOVAH,4CHINT21HCODEENDSENDSTART3)输入下面程序并运行STACKSSEGMENTSTACKDW128DUP(?)STACKSENDSDATASSEGMENTSTRINGDB‘WELCOME!’,13,10,‘$’DATASENDSCODESSEGMENTASSUMECS:CODES,DS:DATASSTART:MOVAX,DATASMOVDS,AXLEADX,STRINGMOVAH,9INT21HMOVAH,4CHINT21HCODESENDSENDSTART4 修正代码STRINGDB"WELCOME!",13,10,"$"START:MOVAX,DATAS5 实验二顺序程序设计1.实验目的(1)学习使用DEBUG的命令;(2)使用DEBUG命令在数据段中查看程序运行的结果;(3)利用DEBUG运行简单的程序段。2.实验内容1)输入程序观察寄存器变化使用DEBUG,将下面的程序段写入内存,逐条执行,观察每条指令执行后,CPU中相关寄存器的内容变化。注意用T命令执行时,CS:IP寄存器的内容MOVAX,4E20ADDAX,1416MOVBX,2000ADDAX,BXMOVBX,AXADDAX,BXMOVAX,001AMOVBX,0026ADDAL,BLADDAH,BLADDBH,ALMOVAH,0ADDAL,BLADDAL,9C6 IP值在不断增加2)下列程序单步运行,注意AL,BX,CX寄存器的变化,并观察数据段字母的变化。如果是将小写字母改成大写字母带注释的语句该如何修改?DSEGSEGMENTMSG1DB‘abc’DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXLEABX,MSG1MOVCX,3S:MOVAL,[BX]ANDAL,11011111B;将AL中的ASCII码的第5位置0,;变成大写字母。MOV[BX],ALINCBXLOOPSMOVAL,0MOVAH,4CHINT21HCSEGENDSENDSTART7 3)程序的跟踪执行操作在DOS下直接输入文件主名就可以执行文件了,有的程序会显示结果,可能执行后什么结果都没有,是因为程序中没有显示命令。那么如何查看程序的运行结果呢?程序执行过程的跟踪操作步骤如下:(1)在DOS下输入:DEBUG文件名.EXE(2)在DEBUG提示符下输入U命令如果程序中有数据段,可以看到反汇编后第一句可执行语句为:A地址:B地址MOVAX,K地址如:1261:0000MOVAX,1260其中:K地址就是数据段的段寄存器内容,A地址为代码段段寄存器地址,B地址为程序第一条指令的偏移地址。(3)可以用T命令单步执行指令,执行到MOVAH,4CH时结束,也可以用G命令执行整个程序,输入:G=B地址(如:G=0000)(4)用D命令查看程序执行后数据段的变化输入:DK地址:0(如:D1260:0)在显示的数据中,对照源程序或LST文件查看结果所在的偏移地址的内容。4)输入下面的程序,按实验一和上面的步骤运行一遍。这是一个两个数相与的程序。结果存放在MSG2单元中,偏移地址为?值为多少?DSEGSEGMENTMSG1DW7856H,2038HMSG2DW?DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXMOVAX,MSG1ANDAX,MSG1+2MOVMSG2,AXMOVAL,0MOVAH,4CH8 INT21HCSEGENDSENDSTART3.编写调试下面的程序,用DEBUG查看数据段中的结果1)Z=((W−X)*10+5)/(X+Y),X,Y,W为字节类型变量,结果存于Z单元,写出数据段和代码段。2)X,Y为字节类型数,求Z=((X+Y)*8−(X−Y)*2)/16,写出完整的数据段和代码段,不用乘除指令。9 实验三分支循环程序设计1.实验目的(1)学习调试程序,查找逻辑错误;(2)学习分支语句的编程和调试;(3)学习循环语句的编程和调试。2.实验内容1)有10个数,统计正数的个数,存放在变量M中中。经过汇编后,形成EXE文件。在DEBUG中,先用G=0命令执行程序,用D命令查看M单元的内容,会发现结果不正确。用单步执行命令T=0,单步执行程序,查找程序中的逻辑错误,注意每一次循环中AL寄存器中值的变化是否正确?(AL寄存器中存放正数的个数)DSEGSEGMENTMSGDB4,-2,-6,0,5,67,8,-3,5,6MDB?DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXMOVCX,10MOVAL,0LEASI,MSGL1:MOVBL,[SI]CMPBL,0JBENEXTINCALNEXT:INCSILOOPL1MOVM,AL10 MOVAL,0MOVAH,4CHINT21HCSEGENDSENDSTART2)数据段中是一组无符号数,将最小数存放在M单元中。按上题方法查找一处逻辑错误。DSEGSEGMENTMSGDB13,15,7,25,24MDB?DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXMOVCX,4MOVAL,MSGMOVSI,OFFSETMSG+1L1:CMPAL,[SI]JBNEXTMOVAL,[SI]NEXT:LOOPL1MOVM,ALMOVAL,0MOVAH,4CHINT21HCSEGENDSENDSTART3)编程:在首地址为BUF开始的内存单元中存有10个字节数,求其中0的个数,并将结果存于RESULT中。11 4)编程:Y=∑Ai∗Bi,Ai,Bi为字节型无符号数,分别存于NUM1和NUM2i=1−8开始的连续存储单元中,结果存于REST单元中。12 实验四子程序设计1.实验目的(1)学习子程序的编写,主子程序的调用;(2)不同模块间程序的调用和调试。2.实验内容1)数据段中的3个字符,调用子程序将其逐个显示出来。子程序的功能是显示一个字符。单步执行,对CALL语句和RET语句观察SP,IP的变化,并用D命令查看栈顶的内容。DATASEGMENTMAGDB‘ABC’DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVSI,0MOVCX,3LL:MOVDL,MAG[SI]CALLMADDINCSILOOPLLMOVAH,4CHINT21HMADDPROCMOVAH,02HINT21HRETMADDENDPCODEENDS13 ENDSTART2)阅读S31.ASM和S32.ASM两个模块中的程序,并分别汇编,然后连接成一个可执行文件S31.EXE。具体步骤如下:MASMS31.ASM(分别汇编)MASMS32.ASMLINKS31S32(将两个文件连接成为一个文件名为S31)S31.EXE(运行)3)编程:利用主程序调用子程序,比较BUF1和BUF2缓冲区中不相等的字符,并将不相等的字符显示出来。(也可以将找到的不相等字符逐个显示,用INT21H的02功能调用)4)编程:子程序搜索指定字符缓冲区中是否有N,如果有用Y替代。调用子程序将BUF1,BUF2,BUF3中的N全部用Y替代。附源程序:NAMES31.ASM不同模块间的段间调用。从键盘输入2位非压缩BCD数,存入AX寄存器中。为了将其转换为二进制数,编写一个子程序TRAN。显示子程序DISP完成将16进制数转换为对应的ASCII码并显示该字符,显示子程序在另一模块S32中。输入数据为00时结束。EXTRNDISP:FARCODESEGMENTPARA‘CODE’ASSUMECS:CODESTART:MOVAH,01HINT21HMOVBL,ALINT21HMOVAH,ALMOVAL,BLCMPAX,3030HJEEXITCALLNEARPTRTRAN14 CALLFARPTRdispJMPSTARTEXIT:MOVAH,4CHINT21HTRANPROCNEAR;将输入的ASCII码转换成2进制数ANDAX,0F0FH;将ASCII码转换成非压缩BCD码,;高位在AL中MOVBL,AHMOVCL,10DMULCLADDAL,BLRETTRANENDPCODEENDSENDSTARTNAMES32.ASMPUBLICDISPCODE1SEGMENTPARA‘CODE’ASSUMECS:CODE1DISPPROCFARMOVBL,ALMOVBH,00MOVCH,4ROLL:MOVCL,4ROLBX,CLMOVDL,BLANDDL,0FHCMPDL,9JBENEXT1ADDDL,07H15 NEXT1:ADDDL,30HMOVAH,02HINT21HDECCHJNZROLLRETDISPENDPCODE1ENDSEND16 实验五DOS功能调用1.实验目的(1)学会DOS中关于显示功能调用指令的用法;(2)领会修改显存方法显示字符。2.实验内容1)输入一个字符,显示出来。2)输入一个字符串,显示出来。3)BUF开始的3个16位二进制数用十六进制数的形式显示出来。(1)理解程序(2)输入程序,汇编,运行(在DOS状态下输入:文件名.EXE),观察结果。(3)如果要分行显示,程序要如何修改?DATASEGMENTBUFDW4F59H,56A8H,0FF90HDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVSI,0P:MOVBX,BUF[SI]MOVCH,4L:MOVCL,4ROLBX,CLMOVDL,BLANDDL,0FHCMPDL,10JBNEXTADDDL,7NEXT:ADDDL,30H17 MOVAH,2INT21HDECCHJNZLINCSIINCSICMPSI,4JNAPMOVAH,4CHINT21HCODEENDSENDSTART4)直接改变显存内容显示。(1)显存空间分配:内存地址空间中,B8000H-BFFFFH共32KB的空间,为80×25彩色字符模式显示缓冲区。向这个地址空间写入数据,写入的内容将立即出现在显示器上。80×25=2000个字符,每个字符在缓冲区中占2个字节,一个字节存放ASCII码,一个字节存放字符属性(字符颜色、字符背景颜色、闪烁、高亮度)(2)偏移地址计算:如第2行,第40列:(2-1)×160+40×2这个偏移地址中存放字符的ASCII码,(2-1)×160+40×2+1这个偏移地址中存放字符的属性。第M行,第N列的一般计算公式为:(M-1)×160+N*2存放ASCII码(M-1)×160+N*2+1存放属性(3)运行下列程序,在屏幕的第1行,会显示一个字符X。根据上面(1)、(2)点理解程序段。STACKSEGMENTDB128DUP(0)STACKENDSCSEGSEGMENT18 ASSUMECS:CSEG,SS:STACKSTART:MOVAX,STACKMOVSS,AXMOVSP,128MOVAX,0B800HMOVES,AXMOVAH,‘X’S:MOVES:[160*1+40*2],AHMOVAL,0MOVAH,4CHINT21HCSEGENDSENDSTART5)编程显示以下图案。*************************6)编写程序,统计字缓冲区中的20个数据的正数、负数、0的个数,并将统计结果以16进制形式显示出来。19 实验六字符处理程序设计1.实验目的(1)熟悉串操作指令的功能与应用;(2)掌握串操作指令的寻址方式及使用方法,编写常用的字符串处理程序。2.实验内容从键盘键入一个字符串,存入内存BUF为首地址的单元中,现要求统计其中含有小写字母的个数,并将统计结果以两位十进制数形式显示在屏幕上。附参考源程序:DATASEGMENTBUFDB90DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVCX,0LEADI,BUFAGAIN:MOVAH,1INT21HCMPAL,0DHJZDONEMOV[DI],ALINCDIINCCXJMPAGAINDONE:MOVDL,0DHMOVAH,2INT21HMOVDL,0AH20 INT21HLEASI,BUFMOVCH,0MOVBL,0CLDNEXT1:LODSBCMPAL,61HJBNEXT2CMPAL,7AHJANEXT1INCBLNEXT2:LOOPNTXT1MOVAL,BLMOVAH,0MOVCL,10DIVCLXCHGAH,ALPUSHAXMOVDL,AHORDL,30HMOVAH,2INT21HPOPAXMOVDL,ALORDL,30HINT21HMOVAH,4CHINT21HCODEEDNSENDSTART21 第3篇课程设计辅导实例1动画设计《甜蜜的生活》1.设计要求1)了解并掌握汇编语言设计的一般方法,具备初步的独立分析和设计能力;2)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3)提高综合运用所学的理论知识和方法独立分析和解决问题的能力;2.主要仪器设备(实验用的软硬件环境)硬件环境:PC机软件环境:DOS操作系统。3.设计内容3.1设计思路整体:设计分为两个画面。第一画面:男孩右手拿花向女孩跑去,这时天上忽然出现了一群小鸟,男孩向女孩求婚,女孩感动地接受了,迸出一颗心。第二画面:两人过着幸福的生活。两人站在房子外,气球飘向了天。3.2设计总体结构图总体结构图见图3.1所示。3.3设计流程图1.静止程序流程图如图3.2所示。2.移动程序的流程图如图3.3所示。3.4动画示意图如图3.4所示。22 开始设置为80*25彩色文本清屏幕清屏幕并延时在21行48列画静止女孩在2行64列画一房子在15行48列画一对男女在21行8列画从左往右跑的男孩在14行37列画一颗心在5行8列画从左往右飞的小鸟在17行24列写字符串Afterthat,theyhaveahappylife!并延时清除小鸟并延时在21行24列画一上升的气球在17行39列写字符串Willyoumarryme?并延时音乐响起在20行53列写字符串清屏幕YesIwill.并延时结束在9行48列画一颗心并延时图3.1程序总体结构图23 字符个数送CX,设置初始坐标DI指向第一个字符保存当前参数:字符个数,行列坐标,字符首址根据偏移计算行列号是否一行画完?是否结束置光标,写字符DI指向下一个字符图3.2静止程序流程图24 字符个数送CX,设置初始坐标DI指向第一个字符保存当前参数:字符个数,行列坐标,字符首址根据偏移计算行列号是是否一行画完?否结束置光标,写字符DI指向下一个字符否图是否画完?是延时取参数:字符个数,行列坐标,字符首址根据偏移计算行列号置光标,写黑色字符清除机器人DI指向下一个字符否图是否清除?是为重画图案设置字符个数,行列坐标,字符首址图3.3移动程序的流程图25 (a)等待(b)相遇,小鸟飞过(c)求婚,心形图案降落26 (d)幸福生活开始(e)音乐响起,音符往上升起图3.4动画示意图3.5设计源程序PUSHRMACROX,Y,Z,WPUSHXPUSHYPUSHZPUSHWENDM;堆栈顶数据弹出到寄存器宏定义27 POPRMACROX,Y,Z,WPOPWPOPZPOPYPOPXENDMSTACKSSEGMENTDW256DUP(?)STACKSENDSDATASEGMENTROBOTDB8;女孩DB2FH,0EH,0,0;左手,字符属性,行偏移,列偏移DB08H,01H,0,1;胸部,字符属性,行偏移,列偏移DB5CH,0EH,0,1;右手,字符属性,行偏移,列偏移DB1EH,05H,1,-1;腹部,字符属性,行偏移,列偏移DB13H,7H,1,0;两腿,字符属性,行偏移,列偏移DB02H,04H,-3,0;面部,字符属性,行偏移,列偏移DB2AH,04H,-1,0;天线,字符属性,行偏移,列偏移DB77H,0FCH,-2,-3;字母wDB68H,0FCH,0,1;字母hDB61H,0FCH,0,1;字母aDB74H,0FCH,0,1;字母tDB27H,0FCH,0,1;标点下引号DB73H,0FCH,0,1;字母sDB0H,0FCH,0,1;空格DB75H,0FCH,0,1;字母uDB70H,0FCH,0,1;字母pDB3FH,0FCH,0,1;标点问号ROBOT1DB22;男孩DB2FH,0EH,0,0;左手,字符属性,行偏移,列偏移28 DB08H,01H,0,1;胸部,字符属性,行偏移,列偏移DB5CH,0EH,0,1;右手,字符属性,行偏移,列偏移DB0C5H,02H,0,1;花柄DB05H,0CH,-1,0;花DB0DBH,02H,2,-2;腹部,字符属性,行偏移,列偏移DB13H,7H,1,0;两腿,字符属性,行偏移,列偏移DB02H,07H,-3,0;面部,字符属性,行偏移,列偏移DB48H,0FCH,-3,-6;字母HDB6FH,0FCH,0,1;字母oDB6EH,0FCH,0,1;字母nDB65H,0FCH,0,1;字母eDB79H,0FCH,0,1;字母yDB2CH,0FCH,0,1;标点逗号DB77H,0FCH,0,1;字母wDB61H,0FCH,0,1;字母aDB69H,0FCH,0,1;字母iDB74H,0FCH,0,1;字母tDB00H,0FCH,0,1;空格DB66H,0FCH,0,1;字母fDB6FH,0FCH,0,1;字母oDB72H,0FCH,0,1;字母rDB00H,0FCH,0,1;空格DB6DH,0FCH,0,1;字母mDB65H,0FCH,0,1;字母eBUFDB12;小鸟DB0C4H,08H,0,0DB0F2H,06H,0,1DB0C4H,08H,-2,2DB0F2H,06H,0,1DB0C4H,08H,3,-129 DB0F2H,06H,0,1DB0C4H,08H,-4,2DB0F2H,06H,0,1DB0C4H,08H,3,-1DB0F2H,06H,0,1DB0C4H,08H,3,-1DB0F2H,06H,0,1BUF1DB‘Willyoumarryme?’LEN1=$-BUF1BUF2DB‘Yes,Iwill.’LEN2=$-BUF2HOUSEDB90;房子DB2FH,03H,0,0;屋顶上升面DB2FH,03H,1,-1DB2FH,03H,1,-1DB2FH,03H,1,-1DB2FH,03H,1,-1DB2FH,03H,1,-1DB0FEH,0FH,-2,5;窗户DB0FEH,0FH,0,1DB0FEH,0FH,1,-1DB0FEH,0FH,0,1DB5CH,03H,-4,0;屋顶的下降面DB5CH,03H,1,1DB5CH,03H,1,1DB5CH,03H,1,1DB5CH,03H,1,1DB5CH,03H,1,1DB0A9H,03H,1,0;屋顶的横DB0A9H,03H,0,-130 DB0A9H,03H,0,-1DB0A9H,03H,0,-1DB0A9H,03H,0,-1DB0A9H,03H,0,-1DB0A9H,03H,0,-1DB0A9H,03H,0,-1DB0A9H,03H,0,-1DB0A9H,03H,0,-1DB0A9H,03H,0,-1DB0A9H,03H,0,-1DB0B3H,03H,1,-1;房子的一竖DB0B3H,03H,1,0DB0B3H,03H,1,0DB0B3H,03H,1,0DB0B3H,03H,1,0DB0B3H,03H,1,0DB0B3H,03H,1,0DB0DBH,0EH,0,6;门DB08H,0E1H,-1,0DB0DBH,0EH,-1,0DB0DBH,0EH,0,1DB0DBH,0EH,1,0DB0DBH,0EH,1,0DB0B3H,03H,0,6;房子的另一竖DB0B3H,03H,-1,0DB0B3H,03H,-1,0DB0B3H,03H,-1,0DB0B3H,03H,-1,0DB0B3H,03H,-1,0DB0B3H,03H,-1,031 DB0C4H,03H,7,0;房底的横DB0C4H,03H,0,-1DB0C4H,03H,0,-1DB0C4H,03H,0,-1DB0C4H,03H,0,-1DB0C4H,03H,0,-1DB0C4H,03H,0,-1DB0C4H,03H,0,-1DB0C4H,03H,0,-1DB0C4H,03H,0,-1DB0C4H,03H,0,-1DB0C4H,03H,0,-1DB0C4H,03H,0,-1DB0C4H,03H,0,-1DB0C5H,02H,0,-5;左边的花DB05H,05H,-1,0DB0C5H,02H,1,1DB05H,05H,-1,0DB0C5H,02H,1,1DB05H,05H,-1,0DB0C5H,02H,1,1DB05H,05H,-1,0DB0C5H,02H,1,1DB05H,05H,-1,0DB0C5H,02H,1,15;右边的花DB05H,05H,-1,0DB0C5H,02H,1,1DB05H,05H,-1,0DB0C5H,02H,1,1DB05H,05H,-1,032 DB0C5H,02H,1,1DB05H,05H,-1,0DB0C5H,02H,1,1DB05H,05H,-1,0DB0DBH,08H,2,-12;台阶DB0DBH,08H,0,1DB0DBH,08H,2,-3DB0DBH,08H,0,1DB0DBH,08H,2,-3DB0DBH,08H,0,1DB0DBH,08H,2,-3DB0DBH,08H,0,1PEOPLEDB15;一对男女DB2FH,0EH,0,0;左手,字符属性,行偏移,列偏移DB08H,06H,0,1;胸部,字符属性,行偏移,列偏移DB5CH,0EH,0,1;右手,字符属性,行偏移,列偏移DB1EH,04H,1,-1;腹部,字符属性,行偏移,列偏移DB13H,7H,1,0;两腿,字符属性,行偏移,列偏移DB02H,04H,-3,0;面部,字符属性,行偏移,列偏移DB2AH,04H,-1,0;天线,字符属性,行偏移,列偏移DB0C5H,02H,2,-2;花柄DB05H,0CH,-1,0;花DB2FH,0EH,1,4;左手,字符属性,行偏移,列偏移DB08H,06H,0,1;胸部,字符属性,行偏移,列偏移DB5CH,0EH,0,1;右手,字符属性,行偏移,列偏移DB0DBH,0AH,1,-1;腹部,字符属性,行偏移,列偏移DB13H,7H,1,0;两腿,字符属性,行偏移,列偏移DB02H,07H,-3,0;面部,字符属性,行偏移,列偏移HEARTDB17DB03H,04H,0,0;心33 DB03H,04H,1,0DB03H,04H,-1,1DB03H,04H,1,0DB03H,04H,1,0DB03H,04H,-1,1DB03H,04H,1,0DB03H,04H,1,0DB03H,04H,-3,1DB03H,04H,1,0DB03H,04H,1,0DB03H,04H,-2,1DB03H,04H,1,0DB29H,04H,-1,1DB28H,04H,0,-6ZIDB‘Afterthat,theyhaveahappylife!’LENZI=$-ZIQIQIUDB10DB4FH,01H,0,0;气球DB0F5H,01H,1,0DB4FH,0BH,-2,3DB0F5H,0BH,1,0DB4FH,0DH,-2,3DB0F5H,0DH,1,0DB4FH,0EH,4,-4DB0F5H,0EH,1,0DB4FH,02H,-2,3DB0F5H,02H,1,0FREQDW5DUP(330),294,262;音乐频率DW5DUP(330)DW5DUP(330),349,392,29434 DW294,262,262,-1TIMEDW4DUP(400),800,400,400;音乐节奏时间DW4DUP(400),800DW8DUP(500)DW500,500,1600COUNTDW0;保存字符个数POINTERDW0;保存字符首地址LINEDB0;保存行号COLUMNDB0;保存列号DATAENDSCODESSEGMENTASSUMECS:CODES,DS:DATA,ES:DATA,SS:STACKSSTART:MOVAX,DATAMOVDS,AXMOVES,AXMOVAH,0;设置为80×25彩色文本方式MOVAL,3INT10HCALLCLEAR;清屏幕LEADI,ROBOT;将ROBOT数据段首地址送DIMOVDX,1530H;显示的起始行号和列号MOVBH,0CALLSTOP;调用静止子程序LEADI,ROBOT1;将ROBOT1数据段首地址送DIMOVDX,1508H;显示的起始行号和列号MOVBH,0CALLMOVES;调用左到右移动子程序LEADI,BUF;将BUF数据段首地址送DIMOVDX,0508H;显示的起始行号和列号MOVBH,035 MOVSI,0;用来判断调用左到右清除子程序CALLMOVES;调用左到右移动子程序CALLERASE;调用右到左清除子程序CALLDELAY1;调用延时时间长的子程序LEABP,BUF1;将字符串数据段首地址送BPMOVCX,LEN1MOVDX,1127H;显示的起始行号和列号MOVBH,0MOVBL,0FCH;闪烁的白底红字MOVAL,0MOVAH,13HINT10HCALLDELAY1;调用延时时间长的子程序LEABP,BUF2;将字符串数据段首地址送BPMOVCX,LEN2MOVDX,1435H;显示的起始行号和列号MOVBH,0MOVBL,0FCH;闪烁的白底红字MOVAL,0MOVAH,13HINT10HCALLDELAY1;调用延时时间长的子程序LEADI,HEART;将心数据段首地址送DIMOVDX,0930H;显示的起始行号和列号MOVBH,0CALLSTOP;调用静止子程序CALLDELAY1;调用延时时间长的子程序CALLCLEAR;清除屏幕CALLDELAY;调用延时时间短的子程序LEADI,HOUSE;将房子数据段首地址送DI36 MOVDX,0240H;显示的起始行号和列号MOVBH,0CALLSTOP;调用静止子程序LEADI,PEOPLE;将人数据段首地址送DIMOVX,1530H;显示的起始行号和列号MOVBH,0CALLSTOP;调用静止子程序LEADI,HEART;将心数据段首地址送DIMOVDX,1425H;显示的起始行号和列号MOVBH,0CALLSTOP;调用静止子程序LEABP,ZI;将字符串数据段首地址送BPMOVCX,LENZIMOVDX,1118H;显示的起始行号和列号MOVBH,0MOVBL,0FCH;闪烁的白底红字MOVAL,0MOVAH,13HINT10HCALLDELAY1;调用延时时间长的子程序LEADI,QIQIU;将气球数据段首地址送DIMOVDX,1508H;显示的起始行号和列号MOVBH,0MOVSI,1;用来判断调用左上移清除子程序CALLMOVES;调用MOVES子程序MOVSI,OFFSETFREQ;将音乐频率数据段首地址送DIMOVDI,OFFSETTIME;将音乐节奏时间数据段首地址送BXTT:MOVCX,[SI]CMPCX,-1JECC;跳出音乐程序37 MOVBX,[DI]CALLGENSOUNDADDSI,2ADDDI,2JMPTTCALLDELAY1;调用延时时间长的子程序CALLCLEAR;清除屏幕CC:MOVAH,4CH;主程序结束返回DOSINT21HMOVESPROC;从左往右移动子程序PUSHRAX,BX,CX,DX;保存寄存器内容PUSHDIXORCH,CHMOVCL,[DI];字符个数送CXINCDI;指向第一个显示符号MOVCOUNT,CX;保存字符个数MOVPOINTER,DI;保存字符首地址MOVLINE,DH;保存行号MOVCOLUMN,DL;保存列号NEXT:ADDDH,[DI+2];根据偏移值计算下一个符号的行号ADDDL,[DI+3];计算列号MOVAH,2INT10H;设置光标位置MOVAL,[DI];取字符MOVBL,[DI+1];取字符属性PUSHCX;保存计数值;设置写彩色字符MOVAH,9MOVCX,1INT10H38 POPCX;恢复计数值ADDDI,4;指向下一个显示字符LOOPNEXT;机器人没画完转NEXTCALLDELAY;延时子程序CMPDL,50JALL;判断是否到50列CMPSI0;判断调用哪个清除子程序JEAACALLERASE1;调用左上移清除子程序JMPBBAA:CALLERASE;调用左到右清除子程序BB:JMPSHORTNEXTLL:POPDIPOPRAX,BX,CX,DXRETMOVESENDPERASEPROC;清除子程序MOVCX,COUNT;字符个数送CXMOVDI,POINTER;字符首地址送DIMOVDH,LINE;行号送DHMOVDL,COLUMN;列号送DLL:ADDDH,[DI+2];根据相对偏移计算行号MOVAH,2;设置光标位置ADDDL,[DI+3]INT10HMOVAL,[DI];取字符MOVBL,0;字符属性为黑底黑字PUSHCXMOVAH,9;写字符MOVX,139 INT10HPOPCXADDDI,4;指向下一个字符LOOPL;未清除完转LMOVCX,COUNT;为重画机器人做准备MOVDI,POINTERMOVDH,LINEINCCOLUMNMOVDL,COLUMNRETERASEENDPERASE1PROC;清楚左上移子程序MOVCX,COUNT;字符个数送CXMOVDI,POINTER;字符首地址送DIMOVDH,LINE;行号送DHMOVDL,COLUMN;列号送DLL2:ADDDH,[DI+2];根据相对偏移计算行号MOVAH,2;设置光标位置ADDDL,[DI+3]INT10HMOVAL,[DI];取字符MOVBL,0;字符属性为黑底黑字PUSHCXMOVAH,9;写字符MOVCX,1INT10HPOPCXADDDI,4;指向下一个字符LOOPL2;未清除完转L2MOVCX,COUNT;为重画做准备40 MOVDI,POINTERDECLINE;上移MOVDH,LINEINCCOLUMNMOVDL,COLUMNRETERASE1ENDPDELAYPROC;延时时间短子程序PUSHRAX,BX,CX,DXMOVDX,9000GO:MOVCX,8000REPEAT:LOOPREPEATDECDXJNEGOPOPRAX,BX,CX,DXRETDELAYENDPDELAY1PROC;延时子时间长程序PUSHRAX,BX,CX,DXMOVDX,9000HGO1:MOVCX,9000HREPE1:LOOPREPE1DECDXJNEGO1POPRAX,BX,CX,DXRETDELAY1ENDPCLEARPROC;清屏幕子程序PUSHRAX,BX,CX,DXMOVBH,741 MOVDX,184FHMOVAX,0600HMOVCX,0INT10HPOPRAX,BX,CX,DXRETCLEARENDPSTOPPROC;静止子程序PUSHRAX,BX,CX,DX;保存寄存器内容XORCH,CHMOVCL,[DI];字符个数送CXINCDI;指向第一个显示符号MOVCOUNT,CX;保存字符个数MOVPOINTER,DI;保存字符首地址MOVLINE,DH;保存行号MOVCOLUMN,DL;保存列号NEXT1:ADDDH,[DI+2];根据偏移值计算下一个符号;的行号ADDDL,[DI+3];计算列号MOVAH,2INT10H;设置光标位置MOVAL,[DI];取字符MOVBL,[DI+1];取字PUSHCX;设置写彩色字符MOVAH,9MOVCX,1INT10HPOPCXADDDI,4;指向下一个显示字符42 LOOPNEXT1;没画完转NEXT1POPRAX,BX,CX,DXRETSTOPENDPGENSOUNDPROCNEARPUSHDXMOVAL,0B6HOUT43H,ALMOVDX,08HMOVAX,3208HDIVCXOUT42H,ALMOVAL,AHOUT42H,ALINAL,61HMOVAH,ALORAL,3OUT61H,ALS2:PUSHDXPUSHAXMOVDX,8HMOVAX,0F05HS1:SUBAX,1SBBDX,0JNZS1POPAXPOPDXDECBXJNZS2MOVAL,AH43 OUT61H,ALPOPDXRETGENSOUNDENDPCODESENDSENDSTART4.问题讨论与分析4.1如何实现图画?ROBOTDB18;女孩DB2FH,0EH,0,0;左手,字符属性,行偏移,列偏移DB08H,01H,0,1;胸部,字符属性,行偏移,列偏移DB5CH,0EH,0,1;右手,字符属性,行偏移,列偏移DB1EH,05H,1,-1;腹部,字符属性,行偏移,列偏移DB13H,7H,1,0;两腿,字符属性,行偏移,列偏移DB02H,04H,-3,0;面部,字符属性,行偏移,列偏移DB2AH,04H,-1,0;天线,字符属性,行偏移,列偏移4.2如何实现静止的图画?PUSHRAX,BX,CX,DX;保存寄存器内容XORCH,CHMOVCL,[DI];字符个数送CXINCDI;指向第一个显示符号MOVCOUNT,CX;保存字符个数MOVPOINTER,DI;保存字符首地址MOVLINE,DH;保存行号MOVCOLUMN,DL;保存列号NEXT1:ADDDH,[DI+2];根据偏移值计算下一个符号的行号ADDDL,[DI+3];计算列号MOVAH,2INT10H;设置光标位置MOVAL,[DI];取字符44 MOVBL,[DI+1];取字PUSHCX;设置写彩色字符MOVAH,9MOVCX,1INT10HPOPCXADDDI,4;指向下一个显示字符LOOPNEXT1;没画完转NEXT1POPRAX,BX,CX,DX以上代码主要运用到单重循环结构。4.3如何实现移动的图画?在静止的基础上,运用清除程序,也就是把图画涂成和屏幕背景一样的颜色,看似被清除,实际上没有,因为视觉原因。MOVCX,COUNT;字符个数送CXMOVDI,POINTER;字符首地址送DIMOVDH,LINE;行号送DHMOVDL,COLUMN;列号送DLL:ADDDH,[DI+2];根据相对偏移计算行号MOVAH,2;设置光标位置ADDDL,[DI+3]INT10HMOVAL,[DI];取字符MOVBL,0;字符属性为黑底黑字PUSHCXMOVAH,9;写字符MOVCX,1INT10HPOPCXADDDI,4;指向下一个字符LOOPL;未清除完转L45 MOVCX,COUNT;为重画机器人做准备MOVDI,POINTERMOVDH,LINEINCCOLUMNMOVDL,COLUMN46 实例2动画设计“我爱大自然”1.设计要求1)了解并掌握汇编语言设计的一般方法,具备初步的独立分析和设计能力;2)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3)提高综合运用所学的理论知识和方法独立分析和解决问题的能力。2.主要仪器设备(实验用的软硬件环境)硬件环境:PC机软件环境:DOS操作系统3.设计内容3.1设计内容及功能实现这个程序的设计是调用BIOS中断子程序,在80*25彩色文本方式编写一个能移动的小汽车程序,并根据通用发声系统工作原理和乐理知识编写了一段音乐程序。整个程序实现的效果:开始时,首先在屏幕上显示“ILOVENATURE,LETUSGOAIRING”,让读者一开始就知道我这个程序的目的。一群小鸟在天空中悠哉游哉地飞往一个小树林,随后,一辆小汽车在两旁种着绿树的林荫大道上不无悠闲地享受着大自然的一草一木,一风一物,不等小汽车走后,音乐突然响起,一首《大海》给了在大自然游玩的游客另一番精神享受。整个程序显示了游客在外兜风的一幅悠闲景象。3.2设计思路分析这个程序包含比较多的景物,既有静态的也有动态的,其中还有一段音乐。为了节省存储空间,提高程序设计的效率和质量,使程序简洁、清晰,便于读者阅读,同时也为了便于修改和扩充,采用子程序设计技术和宏定义,根据程序要实现的若干主要功能及个功能块要调用的公共部分,将程序划分为若干个相对独立的模块,为每一模块编制独立的程序段,最后将这些子程序根据调用关系连成一个整体。这样,整个程序就被分为几个子程序的有机统一。根据BIOS中断调用原理,设置80*25彩色文本显示方式,分别编写一个子程序显示“ILOVENATURE,LETUSGOAIRING”和一个子程序在屏幕上“画”树。这两个子程序所体现出来的事物都是静止的。为了实现小鸟47 能在空中翩翩飞舞和小汽车在林荫路上行驶,还要调用擦除子程序和延时子程序。擦除子程序的原理是根据相对位移设置光标位置,将原来字符属性设置为黑底黑字,以达到擦除效果。延时子程序的原理也很简单,即设置循环次数,让CPU做一些“无用功”,这样读者就能看到小鸟“飞起来”和小汽车“跑起来”。可以改变循环次数来控制延时,达到读者想要的效果。动态的事物就这样产生了。3.3发声原理和编程方法PC机上的大多数输入/输出(I/O)都是由系统插件板上的8255(或8255A)可编程外围接口芯片(PPI)管理的。PPI包括三个8位寄存器,两个用于输入功能,一个用于输出功能。输入寄存器分配的I/O端口号为60H和62H,输出寄存器分配的I/O端口号为61H。当输出寄存器(I/O端口61H)的第0位为1时,控制8254定时器来驱动扬声器,当第1位为1时,扬声器的门电路接通,并一直保持到位1变为0时关闭。即控制电路能以位触发和定时器控制两种不同的方式驱动扬声器发声。计算机中的三个定时器由可编程定时芯片(PROGRAMMABLEINTERVALTIMER/PIT)实现,定时器2用于发声,发声的频率取决于定时器计数器的初始设置值,定时器会将计数值从初始值开始递减到0,然后将计数值复原为初始值,以此循环。计数值的递减由频率为1,193,180HZ的系统振荡器控制着,该频率值在所有的PC家族的机器中是固定的。振荡器每产生一个脉冲,计数值就减一,为了发出不同频率的声音,我们只需要设定不同的初始值即可,发声频率和初始值的关系是:声音频率=1193180/初始值。根据乐理知识,在程序中定义两组数据,即频率数据FREQ和节拍时间数据TIME。频率数据可直接用定时器时钟1193180HZ/已知频率F得到,即FREQ=1234DCH/F.如果将已知频率F保存在DI,可用以下指令来自动求出FREQ的值。MOVDX,0012HMOVAX,34DCHDIVDI从而产生出方波的记数值。由于乐曲属于人耳听到的频率范围,所以已知频率范围在19~20000HZ之间。节拍时间数据TIME=节拍数*节拍时间。例如1=C调、拍号4/4的乐曲中,每1拍为1/4S,2拍为1/2S,4拍为1S,依次类推。音符5的TIME=2拍*1/4S=2*0.25=0.5S=500mS=50*10mS。3.4程序流程图48 1.程序总流程图程序总流程图如图3.5所示。开始设置彩色文本工作方式图3.5程序总流程图清屏幕屏幕中央画树(花),写字符串2.画花子程序流程图清屏幕画花子程序流程图如图3.6所示。小鸟飞往树林汽车在林荫路上行驶音乐响起清屏幕结束49 开始DI指向第一个字符保存寄存器内容字符参数送CX,设置初始坐标根据偏移计算行列号置光标,写字符DI指向下一个字符否大树(花)是否画完是结束图3.6画花子程序流程图3.在道路两旁画小树(小草)子程序流程图道路两旁画小树(小草)子程序流程图见图3.7所示。50 开始循环次数送CX,设置初始坐标字符送AL,字符属性送BL置光标,写字符列号加2否循环结束是结束图3.7道路两旁画小树(小草)子程序流程图4.小鸟飞翔子程序流程图小鸟飞翔子程序流程图如图3.8所示51 开始SI指向下一个字符调用画小树(草)函数否小鸟是否画完设置行列坐标延时调用画大树(花)函数取参数:字符个数、SI指向第一个字符行列坐标、字符首址字符个数送CX,初始行列号根据偏依计算行列号保存寄存器内容置光标,写黑色字符清除小鸟保存当前参数:字符个数、行列坐标、字符首址SI指向下一只小鸟根据偏依计算行列号否小鸟是否清除完?小鸟是否飞到大树处是否是为重画小鸟设置字符个置光标,写字符数、行列坐标,行大于5减2,否则加1结束图3.8小鸟飞翔子程序流程图52 3.5动画示意图见图3.9所示。图(a)树林图(b)道路两旁小草小鸟飞过图(c)小车开过音乐响起图3.9动画示意图53 3.6源程序SETIOMMACROX,Y,Z,L,M,N;功能调用宏定义MOVX,YZL,MINTNENDMPUSHRMACROX,Y,Z,W;寄存器压入堆栈宏定义PUSHXPUSHYPUSHZPUSHWENDMPOPRMACROX,Y,Z,W;栈顶数据弹出到寄存器宏定义POPWPOPZPOPYPOPXENDMSTACKSSEGMENT;堆栈段DW256DUP(?)STACKSENDSDATASEGMENT;数据段STRING1DB‘ILOVENATURE,LETUSGOAIRING’;要显示的字符串’ILOVE;NATURE,LETUSGOAIRING’STRLEN1EQU$-STRING1;串长FLOWERDB23;画(大树)字符图形参数表DB‘W’,0AH,0,0DB‘W’,0AH,0,1DB‘W’,0AH,0,154 DB‘W’,0AH,0,1DB‘W’,0AH,0,1DB‘)’,0AH,1,0DB‘_’,0AH,0,-1DB‘_’,0AH,0,-1DB‘_’,0AH,0,-1DB‘(‘,0AH,0,-1DB‘Y’,0AH,1,2DB‘|’,06H,1,0DB‘/’,0AH,0,1DB‘’,0AH,0,-2DB‘|’,06H,1,1DB‘/’,0AH,0,1DB‘|’,06H,1,-1DB‘’,0AH,0,-1DB‘|’,06H,1,1DB‘/’,06H,0,1DB‘/’,06H,0,1DB‘’,06H,0,-3DB‘’,06H,0,-1BIRDDB5;小鸟字符图形参数表DB1AH,06H,0,0DB1AH,06H,0,1DB1AH,06H,1,0DB1AH,06H,0,1DB20H,00H,0,1CARDB8;小汽车的字符图形表DB23H,7,0,0DB0B1H,7,0,1DB0DBH,7,0,155 DB0DBH,7,0,1DB4FH,7,1,0DB4FH,7,0,-3DB1,7,-2,1DB20H,0,0,1COUNTDW0;保存字符个数POINTERDW0;保存字符首址LINEDB0;保存行号COLUMNDB0;保存列号TREEDB5,0AHFREQDW196,220;定义曲谱音符的频率DW262,262,262,262,262,220,196DW262,262,262,262,294,262,220,262DW294,294,294,294,294,262,220DW294,294,294,294,330,294,330,392DW440,440,392,440,392,330DW294,294,330,294,262,220,196,220DW262,262,262,262,262,220DW262,196,220DW440,440,392,440,524,440DW392,330,294,262,220,196,220DW262,262,262,262,294,262DW262,330,392DW440,440,440,440,524,440DW392,392,392,440,392,330,294DW262,262,262,262,294DW330,330,294DW262,262,262,262,524,440DW392,392,392,440,392,330,392DW440,524,524,440,39256 DW392,330,392DW440,440,440,440,524,440DW392,392,392,440,392,330,294DW262,262,262,262,392DW330,330,294DW262,262,262,262,294,330DW392,392,330,392,330,392DW440DW9,9,196,660,294,294,262DW262,1TIMEDW400,400;定义节拍时间数据DW400,200,400,400,800,400,400DW400,200,400,200,200,800,400,400DW400,200,400,400,800,400,400DW400,200,400,200,200,800,400,400DW400,800,400,800,400,400DW400,200,200,400,400,800,400,400DW400,200,400,400,800,800DW1600,800,800DW400,800,400,800,400,400DW400,400,400,400,800,400,400DW400,800,400,800,400,200DW2400,400,400DW400,800,400,800,400,400DW400,800,200,200,800,400,400DW400,800,400,800,800DW2400,400,400DW400,800,400,800,400,400DW400,800,200,200,800,400,400DW800,400,800,400,20057 DW2400,400,400DW400,800,400,800,400,400DW400,800,200,200,800,400,400DW400,800,400,800,800DW2400,400,400DW400,800,400,800,400,400DW400,800,400,800,400,400DW3200DW800,400,400,400,400,400,400DW4000DATAENDSCODESSEGMENTASSUMECS:CODES,DS:DATA,ES:DATA,SS:STACKSSTART:MOVAX,DATAMOVDS,AXMOVES,AXSETIOMAH,0,MOV,AL,3,10H;设置为80×25彩色文本方式CALLCLEARCALLWRITE1;显示’ILOVENATURE,LETUS;GOAIRING’CALLDELAY2;较长延迟CALLCLEAR;清屏幕CALLMOVEBIRD;小鸟飞往树林CALLMOVECAR;小汽车在林荫路上行驶CALLMUSIC;音乐响起CALLCLEAR;清屏幕MOVAX,4C00HINT21H;程序结束;在屏幕中央画4棵大树(花);并在大树(花)底下写字符串’ILOVENATURE,LETUSGOAIRING’子程序:58 WRITE1WRITE1PROCMOVDX,0512H;定义起始行列号CALLHUA;调用画大树(花)子程序MOVDX,051BH;重新定义起始行列号CALLHUA;再调用画大树(花)子程序MOVDX,0525HCALLHUAMOVDX,052EHCALLHUAPUSHRAX,BX,CX,DX;保存积存器内容LEABP,STRING1;字符串首地址送BPMOVCX,STRLEN1;串长送CXMOVDX,0E13H;确定字符串的起始位置MOVBH,0MOVBL,84H;字符属性()SETIOMAL,0,MOV,AH,13H,10H;以方式0写字符串POPRAX,BX,CX,DX;恢复积存器内容RETWRITE1ENDP;小鸟飞翔子程序:MOVEBIRDMOVEBIRDPROCCALLDRAWTREE;调用画小草子程序CALLDRAWTREE1;在道路两旁画小草MOVDX,063CH;为大树(花)定义起始行列号CALLHUA;画大树(花)LEASI,BIRD;小鸟字符参数表首地址送SIMOVDX,1403H;初始行列号PUSHRAX,BX,CX,DX;保存寄存器内容PUSHSI59 XORCH,CHMOVCL,[SI];字符个数送CXINCSI;指向第一个显示符号MOVCOUNT,CX;保存字符个数MOVPOINTER,SI;保存字符首地址MOVLINE,DH;保存行号MOVCOLUMN,DL;保存列号NEXTB:ADDDH,[SI+2];根据偏移值算下一个符号的行号ADDDL,[SI+3];计算列号CMPDL,60;判断小鸟是否到大树JBWRITEB;否,继续画POPSIPOPRAX,BX,CX,DXRETWRITEB:MOVAH,2INT10H;设置光标位置MOVAL,[SI];取字符MOVBL,[SI+1];取字符属性PUSHCX;保存计数值;设置写彩色字符MOVAH,9MOVCX,1INT10HPOPCX;恢复计数值ADDSI,4;指向下一个显示字符LOOPNEXTB;小鸟没画完转NEXTBCALLDELAY;调用延时子程序CALLERASEBIRD;调用清除小鸟子程序JMPSHORTNEXTBMOVEBIRDENDP60 ;擦除小鸟子程序:ERASEBIRDERASEBIRDPROCMOVCX,COUNT;字符个数送CXMOVSI,POINTER;字符首地址送DIMOVDH,LINE;行号送DHMOVDL,COLUMN;列号送DLLB:ADDDH,[SI+2];根据相对偏移计算行号MOVAH,2;设置光标位置ADDDL,[SI+3]INT10HMOVAL,[SI];取字符MOVBL,0;字符属性为黑底黑字PUSHCXSETIOMAH,9,MOV,CX,1,10H;写字符POPCXADDSI,4;指向下一个字符LOOPLB;未清除完转LBMOVCX,COUNT;为重画小鸟做准备MOVSI,POINTERCMPLINE,5H;把小鸟飞翔高度限定在一定范;围,更具动态感JASUBT;大于的时候则跳转SUBTJMPAD;小于则加1AD:INCLINEJMPMOVESUBT:SUBLINE,2;大于5时减2MOVE:MOVDH,LINEINCCOLUMNMOVDL,COLUMNRET61 ERASEBIRDENDP;小汽车移动子程序:MOVECARMOVECARPROCLEADI,CARMOVDX,1300HPUSHRAX,BX,CX,DXPUSHDIXORCH,CHMOVCL,[DI];字符个数送CXINCDI;指向第一个显示符号MOVCOUNT,CX;保存字符个数MOVPOINTER,DI;保存字符首地址MOVLINE,DH;保存行号MOVCOLUMN,DL;保存列号NEXTC:ADDDH,[DI+2];根据偏移值算下一个符号的行号ADDDL,[DI+3];计算列号CMPDL,80;判断是否到屏幕最右端JBWRITEC;若否,继续画POPDIPOPRAX,BX,CX,DXRETWRITEC:MOVAH,2INT10H;设置光标位置MOVAL,[DI];取字符MOVBL,[DI+1];取字符属性PUSHCX;保存计数值;设置写彩色字符MOVAH,9MOVCX,1INT10H62 POPCX;恢复计数值ADDDI,4;指向下一个显示字符LOOPNEXTC;小汽车没画完转NEXTCCALLDELAY;调用延时子程序CALLERASECAR;调用清除小汽车子程序JMPSHORTNEXTCMOVECARENDP;清除小汽车子程序:ERASECARERASECARPROCMOVCX,COUNT;字符个数送CXMOVDI,POINTER;字符首地址送DIMOVDH,LINE;行号送DHMOVDL,COLUMN;列号送DLLL:ADDDH,[DI+2];根据相对偏移计算行号MOVAH,2;设置光标位置ADDDL,[DI+3]INT10HMOVAL,[DI];取字符MOVBL,0;字符属性为黑底黑字PUSHCXMOVAH,9;写字符MOVCX,1INT10HPOPCXADDDI,4;指向下一个字符LOOPLL;未清除完转LLMOVCX,COUNT;为重画小汽车做准备MOVDI,POINTERMOVDH,LINECMPDL,8063 JAEENDLINCCOLUMN;INC向左走,DEC向右走MOVDL,COLUMNENDL:RETERASECARENDP;画树子程序DRAWTREEPROCPUSHRAX,BX,CX,DXMOVDX,1608H;初始行列号MOVCX,26;将小树树木送CXMOVAL,TREE;字符送ALMOVBL,TREE+1;字符属性送BLTRE:MOVAH,2;置光标INT10HPUSHCXSETIOMAH,9,MOV,CX,1,10H;写字符ADDDL,2POPCXLOOPTREPOPRAX,BX,CX,DXRETDRAWTREEENDP;由于道路两旁的树木有不同的初始行列号,故再次定义与上面程序功能一样的子程序DRAWTRE1PROCPUSHRAX,BX,CX,DXMOVDX,1011HMOVCX,26MOVAL,TREEMOVBL,TREE+164 TRE1:MOVAH,2INT10HPUSHCXSETIOMAH,9,MOV,CX,1,10HADDDL,2POPCXLOOPTRE1POPRAX,BX,CX,DXRETDRAWTRE1ENDP;画大树(花)子程序HUAPROCLEADI,FLOWERPUSHRAX,BX,CX,DXXORCH,CHMOVCL,[DI];字符个数送CXINCDI;指向第一个显示符号NEXTH:ADDDH,[DI+2]ADDDL,[DI+3]MOVAH,2INT10H;设置光标位置MOVAL,[DI];取字符MOVBL,[DI+1];取字符属性PUSHCX;保存计数值;设置写彩色字符MOVAH,9MOVCX,1INT10HPOPCX;恢复计数值ADDDI,4;指向下一个显示字符65 LOOPNEXTH;大树(花)没画完转NEXTHPOPRAX,BX,CX,DXRETHUAENDP;音乐子程序MUSICPROCPUSHRAX,BX,CX,DXMOVSI,OFFSETFREQMOVDI,OFFSETTIMEL1:MOVCX,[SI];发声频率送CXCMPCX,1JEEXITMOVBX,[DI]PUSHDXMOVAL,0B6H;设置定时器的控制寄存器,也就;是将0B6H送到43H端口OUT43H,AL;发命令给寄存器MOVDX,08HMOVAX,3208HDIVCXOUT42H,AL;初始值的低位字节和高位字节送;到42H端口MOVAL,AHOUT42H,AL;输出频率低字节INAL,61H;通过将61H端口的位0和位1设;置为1将扬声器打开MOVAH,ALORAL,3OUT61H,AL;驱动扬声器L2:PUSHDX66 PUSHAXMOVDX,8HMOVAX,0F05HS1:SUBAX,1SBBDX,0JNZS1POPAXPOPDXDECBXJNZL2MOVAL,AHOUT61H,AL;将端口61H的位0和位1清零,;关闭扬声器POPDXADDSI,2ADDDI,2JMPL1EXIT:POPRAX,BX,CX,DXRETMUSICENDP;延时子程序:DELAYDELAYPROCPUSHRAX,BX,CX,DXMOVDX,7000;设置外循环计数值GO:MOVCX,20000;设置内循环计数值REPEAT:LOOPREPEAT;内循环是否结束DECDXJNEGO;外循环是否结束POPRAX,BX,CX,DXRET67 DELAYENDP;由于延时时间不一样,故再定义与上面程序功能一样的子程序:DELAY2DELAY2PROCPUSHRAX,BX,CX,DXMOVDX,50000GO2:MOVCX,50000REPEAT2:LOOPREPEAT2DECDXJNEGO2POPRAX,BX,CX,DXRETDELAY2ENDP;清屏幕子程序:CLEARCLEARPROCPUSHRAX,BX,CX,DXMOVBH,7MOVDX,184FHMOVAX,0600H;用当前也上滚功能调用清屏幕MOVCX,0INT10HPOPRAX,BX,CX,DXRETCLEARENDPCODESENDSENDSTART68 第4篇模拟试卷试卷一一、单项选择题(本大题共15小题,每小题2分,共30分)1.与MOVBX,OFFSETVAR指令完全等效的指令是()。(A)MOVBX,VAR(B)LDSBX,VAR(C)LESBX,VAR(D)LEABX,VAR2.DEBUG中的执行一段子程序的命令是()。(A)D(B)T(C)P(D)U3.不能作为地址指针的寄存器是()。(A)CX(B)BX(C)DI(D)SI4.已知,(AX)=0F234H,执行ORAX,963FH后,则SF,CF的值为()。(A)SF=1,CF=1(B)SF=1,CF=0(C)SF=0,CF=1(D)SF=0,CF=05.AL=11011011B,CL=2,执行SARAL,CL后,AL寄存器的内容是()。(A)00110110(B)01101100(C)01101111(D)111101106.下面两个传送指令语句中源操作数寻址方式是()。VAR1DW32HVAR2=32H......MOVAX,VAR1MOVBX,VAR2(A)都是立即数寻址(B)立即数寻址,直接寻址(C)直接寻址,立即数寻址(D)都是直接寻址7.变量具有()。(A)偏移属性(B)符号属性69 (C)段属性(D)段属性和偏移属性8.寄存器间接寻址方式中,操作数在()中。(A)通用寄存器(B)堆栈(C)内存单元(D)段寄存器9.下列对END语句的叙述正确的是()。(A)END是一可执行语句(B)END表示程序执行到此结束(C)END表示源程序到此结束(D)END在汇编后产生机器码10.下列叙述不正确的是()。(A)存储单元与逻辑地址之间的关系是一一对应的(B)存储单元与物理地址之间是一一对应的(C)一个逻辑地址对应一个存储单元(D)一个存储单元可以用不同的段地址和偏移地址表示11.下列指令合法的是()。(A)OUTAX,30H(B)OUTDX,AL(C)OUTAL,DX(D)OUT30H,AH12.当一个带符号数大于0FBH时程序转移,选择的条件转移指令是()。(A)JNLE(B)JLE(C)JNL(D)JA13.用于显示单个字符的DOS系统功能调用,应设置AH寄存器的内容为()。(A)1H(B)2H(C)9H(D)0AH14.完成与指令XCHGAX,BX相同功能的指令或指令序列是()。(A)MOVAX,BX(B)MOVBX,AX(C)PUSHAX(D)MOVCX,AXPOPBXMOVAX,BXMOVBX,CX15.下面的CMP指令中,语法正确的指令是().(A)CMPBUF1,BUF2(B)CMPAL,0FH70 (C)CMPBUF1,0FH(D)CMPAL,BX二、阅读程序题(本大题共3小题,每小题6分,共18分)1.阅读程序(1)写出程序的功能;(2)程序执行后DAT和DAT+1单元的内容是什么?DATASEGMENTDATDB98H,27HDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,DATCMPAL,DAT+1JNGDONEXCHGAL,DAT+1MOVDAT,ALDONE:MOVAH,4CHINT21HCODEENDSENDSTART2.对于下面的数据定义,各条MOV指令单独执行后,请填写有关寄存器的内容。DATASEGMENTTABLE1DW30HTABLE2DW20DUP(?)TABLE3DB‘ABCD’DATAENDS.MOVBX,TYPETABLE2(BX=_______)MOVCX,LENGTHTABLE2(CX=_______)MOVDX,OFFSETTBLE3(DX=_______)71 3.阅读下列程序,写出指令段实现的功能。MOVAL,XADDAL,YMOVCL,3SALAL,CLMOVBL,XSUBBL,YSALBL,1SUBAL,BLMOVCL,4SARAL,CLMOVZ,AL三、阅读填空题(本大题共2小题,共有6个空,每个空格2分,共12分)1.从DAT开始的单元中存放着多个有符号的字节数。下面程序实现对其处理。如果数据大于等于0,则屏蔽高4位;如果小于0则将其求补,处理后的数据仍保留在原单元中。在下面每一空白处填上一条适当的指令。DATASSEGMENTDATDB77H,88H,0AAH,0BBH,13HCOUNTEQU$-DATDATASENDSCODESEGMENTASSUMECS:CODE,DS:DATASSTART:MOVAX,DATASMOVDS,AXLEASI,DATMOVCX,COUNTLL1:MOVAL,[SI]CMPAL,0JGELL272 JMPPPLL2:PP:INCSILOOPLL1MOVAH,4CHINT21HSUB1PROCNEGALMOV[SI],ALRETSUB1ENDPSUB2PROCRETSUB2ENDPCODEENDSENDSTART2.下面程序段是完成用单个字符输入的1号功能调用,从键盘输入10个字符。然后再用单个字符显示输出的2号功能调用,并以相反顺序显示输出这10个字符。试在空白处填上适当的指令(每个空白处只能填一条指令)。MOVCX,10LOP1:MOVAH,01HINT21HLOOPLOP1MOVCX,10LOP2:MOVAH,02HINT21H73 LOOPLOP2四、程序设计题(本大题共3小题,其中第1小题12分,第2小题13分,第3小题15分,共40分)1.X,Y,W为字节类型的数,求Z=((W-X)*10+5)/(X+Y)),其中X,Y,W为字节类型的数,数值分别为:38H,28H,48H。2.利用主程序调用子程序,比较BUF1和BUF2缓冲区中不相等的字符,并将不相等的字符显示出来。3.在首地址为TAB的数组中按递增次序存放着100个数,试编程将出现次数最多的数以及出现的次数分别存放于变量NUM和COUNT中,并以:COUNT=?的形式输出COUNT的值(设最多重复次数<10)。74 试卷二一、单项选择题(本大题共20小题,每小题2分,共40分)1.下列四个寄存器中,可作为16位寄存器的是()。(A)AL(B)BL(C)BP(D)BH2.逻辑移位指令SHL,用于()。(A)带符号数倍增(B)带符号数倍减(C)无符号数倍增(D)无符号数倍减3.在程序的运行过程中,确定下一条指令的物理地址的计算表达式是()。(A)CS*16+IP(B)DX*16+DI(C)SS*16+SP(D)ES*16+SI4.下面表示宏定义结束的命令是()。(A)ENDP(B)ENDS(C)ENDM(D)END5.用于输入单个字符的DOS系统功能调用,应设置AH寄存器的值为()。(A)1H(B)2H(C)9H(D)0AH6.下列指令中有语法错误的是()。(A)MOV100H,BX(B)MOV[100H],25(C)MOV[100H],BX(D)MOV[BX],100H7.两个无符号数比较,如表示大于时转到NEXT处,应选用的指令是()。(A)JNBENEXT(B)JNLENEXT(C)JBENEXT(D)JLENEXT8.寄存器直接寻址方式中,操作数在()中。(A)通用寄存器(B)堆栈(C)内存单元(D)段寄存器9.下列寄存器组中在段内寻址时可以提供偏移地址的寄存器组是()。(A)AX,BX,CX,DX(B)BX,BP,SI,DI(C)SP,IP,BP,DX(D)CS,DS,ES,SS10.下面指令序列执行后完成的运算,正确的算术表达式是()。MOVDL,X75 SARDL,1MOVY,DL(A)Y=X*2(B)X=Y*2(C)Y=X/2(D)X=Y/211.在标志寄存器中,用以记录当前运算结果是否为0的标志位是()。(A)CF(B)ZF(C)OF(D)SF12.当前指令的地址存放在()中(A)DS:BP(B)SS:SP(C)CS:PC(D)CS:IP13.下列指令执行后,可能改变BL寄存器内容的指令是()。(A)TESTBL,0FFH(B)ORBL,00H(C)CMPBL,00H(D)XORBL,BL14.与MOVBX,OFFSETVAR指令完全等效的指令是()。(A)MOVBX,VAR(B)LDSBX,VAR(C)LESBX,VAR(D)LEABX,VAR15.汇编语言源程序中,每个语句由四项组成,如语句要完成一定的功能,不可省略的项是()。(A)名字项(B)操作项(C)操作数项(D)注释项16.汇编语言源程序的扩展名是()。(A).ASM(B).OBJ(C).EXE(D).COM17.能够将BL的低4位清0的指令是()。(A)ANDBL,0F0H(B)ANDBL,00H(C)ORBL,0F0H(D)ORBL,00H18.已知,(AX)=9023H,执行ORAX,001BH后,则SF,CF的值为()。(A)SF=1,CF=1(B)SF=1,CF=0(C)SF=0,CF=1(D)SF=0,CF=019.设OP1、OP2是变量,下面哪条指令是正确的()。(A)CMPBX,OP2(B)CMP[AX],OP2(C)CMPOP1,OP2(D)CMPOP2,0FFH20.用DEBUG调试程序时,单步执行命令是()。(A)G(B)U(C)D(D)T76 二、阅读程序题(本大题共3小题,其第1、2小题均为6分,第3小题为6分,共20分)1.执行下面程序段后,AX、CX的值为多少?CODESEGMENTASSUMECS:CODESTART:MOVCH,0MOVCL,1MOVBL,2MOVAH,0AGAIN:MOVAL,BLINCBLMULBLADDCX,AXCMPAX,0015HJBAGAINMOVAH,4CHINT21HCODEENDSENDSTART2.阅读程序,写出指令段实现的数学公式。MOVBL,XADDBL,YMOVAL,WSUBAL,XIMULTENADDAX,5IDIVBLMOVZ,AXMOVAL,03.写出程序的功能和结果。DSEGSEGMENT77 NUM1DB1,2,3,4,5,6,7,8NUM2DB1,2,3,4,5,6,7,8RESULTDW?DSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXMOVCX,8MOVBX,0MOVSI,OFFSETNUM1MOVDI,OFFSETNUM2AGAIN:MOVAL,[SI]MULBYTEPTR[DI]ADDBX,AXINCDIINCSILOOPAGAINMOVRESULT,BXMOVAL,0MOVAH,4CHINT21HCSEGENDSENDSTART三、程序设计题(本大题共3小题,其中第1小题12分,第2小题13分,第3小题15分,共40分)1.编程显示以下图案。*********************78 ****2.首地址为BUF的内存单元中存有10个字节数,统计其中单元内容为0的单元个数,并将统计的结果显示出来。3.编写子程序搜索指定字符缓冲区中是否有小写字母N,如果有则用Y替代。江调用子程序将BUF1,BUF2中的N全部用Y替代。79 试卷三一、单项选择题(本大题共20小题,每小题1分,共20分)1.下面四个寄存器中,不能作为间接寻址的寄存器是()。(A)BX(B)DX(C)BP(D)DI2.用来表示堆栈指针的寄存器是()。(A)IP(B)BP(C)SP(D)SS3.完成BX清零,并使标志位CF清零,下面错误的指令是()。(A)SUBBX,BX(B)XORBX,BX(C)MOVBX,00H(D)AMDBX,00H4.下面数据传送指令中,正确的指令是()。(A)MOVBUF1,BUF2(B)MOVCS,AX(C)MOVCL,1000H(D)MOVDX,WORDPTR[BX+DI]5.下面指令中,源操作数的寻址方式为直接寻址的指令是()。(A)ADDAX,WORDPTR[BX+SI](B)ADDAX,B(C)INCCX,1000H(D)MOVBX,7FFFH6.下面表示段定义结束的命令是()。(A)ENDP(B)ENDS(C)ENDM(D)END7.设AL,BL中都是有符号数,当AL≤BL时转至NEXT处,在CMPAL,BL指令后应选用正确的条件转移指令是()。(A)JBE(B)JNC(C)JNA(D)JNLE8.指令LOOPZ的循环执行条件是()。(A)CX≠0并且ZH=0(B)CX≠0或ZH=0(C)CX≠0并且ZH=1(D)CX≠0或ZH=19.执行下列指令后,SP寄存器的值是()。MOVSP,1000HPUSHAX80 (A)0FFEH(B)0FFFH(C)1001H(D)1002H10.完成有符号数BX的内容除以2的正确指令是()。(A)SHRBX,1(B)SARBX,1(C)RORBX,1(D)RCRBX,111.下面指令中影响状态标志位CF的指令是()。(A)INCAX(B)DECAX(C)NOTAX(D)DECAX12.判断当CX=0时,转ZERO执行的错误指令是()。(A)CMPCX,0(B)MOVAX,CXJZZEROJZZERO(C)ORCX,CX(D)JCXZZEROJZZERO13.执行1号DOS系统功能调用后,从键盘输入的字符应存放在()。(A)AL中(B)BL中(C)CL中(D)DL中14.设数据定义如下:ARRAYDW1,2,3执行指令ADDSI,TYPEARRAY相当于完成下面同等功能的指令是()。(A)ADDSI,1(B)ADDSI,2(C)ADDSI,3(D)ADDSI,015.设数据定义如下:BUFDW100DUP(?)执行指令MOVCX,LENGTHBUF相当于完成下面同等功能的指令是()。(A)MOVCX,00C8H(B)MOVCX,0200H(C)MOVCX,0064H(D)MOVCX,0100H16.完成对字单元BUF的内容加1运算,下面错误的指令是()。(A)MOVCX,BUF(B)MOVBX,OFFSETBUFINCBXINCWORDPTR[BX]MOVBUF,BX(C)MOVBX,BUF(D)MOVBX,0INCWORDPTR[BX]INCWORDPTRBUF[BX]81 17.完成对寄存器BX内容的求补运算,下面错误的指令是()。(A)NEGBX(B)NOTBXINCBX(C)XORBX,0FFFFH(D)MOVAX,0INCBXSUBAX,BX18.判断当AX的内容为负数时,转MINUS执行,下面错误的指令是()。(A)NOTAX(B)TESTAX,8000HJNSMINUSJNSMINUS(C)SHLAX,1(D)ORAX,AXJCMINUSJNSMINUS19.下面指令执行后,正确的结果是()。MOVAL,0FEHADDAL,ALADCAL,AL(A)AL=0F8HCF=1(B)AL=0F8HCF=0(C)AL=0F9HCF=0(D)AL=0F9HCF=120.现有数据存储如下图所示:设AL=01H,BX=0100H,DX=3000H,执行换码指令XLAT后正确的结果是()。30100H40H30101H79H30102H24H30103H30H(A)AL=00H(B)AL=40H(C)AL=01H(D)AL=79H二、填空题(本大题共6小题,每空1分,共14分)1.8086CPU允许的最大存储空间为,其地址编号从到H。2.汇编语言是一种面向的语言。完成将汇编语言源程序翻译成机器语言目的程序的翻译程序称。3.8086的存储器是分段的,因此存储单元的物理地址是由和组合而成的。82 4.标号和变量(名字)均有三种属性,它们是、和属性5.判断无符号运算是否溢出,应根据标志位;而判断有符号数运算是否溢出,应根据标志位。6.在16位存储单元中能存储的最大无符号数为65535,能表示的有符号数的范围是H到H。三、简答题(本大题共3小题,每小题3分,共9分)1.数据存储示意如下图所示,请用DUP语句写出合适的数据定义伪指令:BUFFER1232341232342.选用合适的指令,分别完成下列操作:A)将字变量VARW的偏移地址送BX寄存器;B)将字变量VARW的内容送CX寄存器;C)将字变量VARW的类型值送DX寄存器。3.设有数据定义伪指令如下:ORG2000HARRAYDW0100H,0200H,$+2,0300H,$+2请画出存储单元数据的存储形式。四、程序分析题(本大题共5小题,每小题6分,共30分)83 1.MOVAX,00FFHMOVBX,0FFFFHXORAX,BXNEGAX问:该程序段执行后AX=,CF=。2.MOVAX,BXNEGAXADDAX,BX问:该程序执行后AX=,CF=。3.BUFDW0000H…LEABX,BUFSTCRCRWORDPTR[BX],1MOVCL,3SARWORDPTR[BX],CL问:该程序执行后,存储单元BUF的内容为。4.BLOCKDB20H,1FH,08H,81H,0FFH…RESULTDB?…START:LEASI,BLOCKMOVCX,[SI]INCSIMOVAL,[SI]LOP1:CMPAL,[SI+1]JNGNEXTMOVAL,[SI+1]NEXT:INCSILOOPLOP1MOVRESULT,AL84 HLT问:(1)该程序所完成的功能是;(2)该程序循环次数是:。5.CODESEGMENTASSUMECS:CODESTART:MOVCX,1MOVBL,2AGAIN:MOVAL,BLINCBLINCBLADDCX,AXCMPAX,002AHJBAGAINMOVAH,4CHINT21HCODEENDSENDSTART问:(1)该程序所完成的功能可用算术表达式表示为;(2)该程序完成后CX=。五、程序填空题(本大题共2小题,每小题6分,共12分)(下列各小题中,每空只能填一条指令)1.下面程序完成十进制数3298+4651的运算,并将结果存入SUM单元开始的2个字节单元中,请将程序补充完整。DA1DB98H,32HDA2DB51H,46HSUMDB2DUP(?)…MOVSI,OFFSETDATLEADI,DAT85 ADDAL,[DI]MOVSUM,ALMOVAL,[SI+1]DAAMOVSUM+1,ALHLT2.下面程序利用DOS系统功能调用,完成将键盘输入的小写字母转换成大写字母后输出显示,直到输入’$’字符结束。请将程序补充完整。CODESEGMENTASSUMECS:CODEDISPLAYPROCNEARBEGINMOVAH,01HINT21HJZSTOPCMPAL,‘a’JBSTOPCMPAL,‘z’JASTOPMOVAH,02HINT21HJMPBEGINSTOP:RETDISPLAYENDPCODEENDS六、程序设计题(本大题共2小题,其中第1小题5分,第人小题10分,共15分)1.设在DAT1,DAT2字单元中存放一双字长有符号数,编一程序段,完成求出该双字长86 数的绝对值后送ABS1和ABS2字存储单元。(本小题5分)2.在附加数据段中有一首址为ADDR的没有排序的字数组,数据的第一个字为数组长度,第二个字开始存放数组各元素。在KEY单元存放一要删除的字数据。要求编一完整程序,在数组中查找该数,如果找到该数,将其从数组中删除,并修改数组长度。(本小题10分)87 试卷一参考答案一、填空题1D2C3A4B5D6C7D8C9C10A11B12A13B14B15B二、阅读题1.(1)比较DAT与DAT+1单元的内容,小的数放在DAT单元(2)27H,98H2.BX=2CX=20DX=423.Z=((X+Y)*8-(X-Y)*2)/16三、程序填空题1.CALLSUB2CALLSUB1ANDAL,0FHMOV[SI],AL2.PUSHAXPOPDX四、程序设计题(参考答案,也可以用其它方法)1.DSEGSEGMENTXDB38HYDB20HWDB30HZDW?TENDB10DSEGENDSCSEGSEGMENTPARAPUBLIC"CODE"ASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEGMOVDS,AXMOVBL,XADDBL,Y;先求分母,存于BLMOVAL,WSUBAL,XIMULTEN88 ADDAX,5IDIVBLMOVZ,AXMOVAL,0MOVAH,4CHINT21HCSEGENDSENDSTART2.DATASEGMENTBUF1DB"HUIFEHJFKHKFJ"LEN1=$-BUF1BUF2DB"HUIFEHJFIOIHJ"BUFDBLEN1DUP(?);不相同的字符存在BUF开始的缓冲区DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEADI,BUF1LEASI,BUF2MOVCX,LEN1LEABX,BUFCALLKLLMOVBYTEPTR[BX],"$";在要显示的字符串末尾加"$":显示字符串BUFLEADX,BUFCALLPRINTMOVAH,4CHINT21H;比较2个字符串,将不相同的字符送到BX开始的存储空间,入口参数为2个字符89 串的偏移地址SI,DI,以及字符串的长度CXKLLPROCAL1:MOVAL,[SI]CMP[DI],ALJEAL2MOV[BX],ALINCBXAL2:INCSIINCDILOOPAL1RETKLLENDPPRINTPROCNEAR;显示字符串子程序MOVAH,9INT21HRETPRINTENDPCODEENDSENDSTART3.在首地址为TAB的数组中按递增次序存放着100个数,试编程将出现次数最多的数以及出现的次数分别存放于变量NUM和COUNT中,并以:COUNT=?的形式输出COUNT的值(设最多重复次数<10)。DATASEGMENTBUFDB1,2,14H,14H,14H,14H,14H,15H,15H,15H,17H,17H,59H,...LEN=$-BUFNUMDB?COUNTDB0MMDB"COUNT=","$"DATAENDSCODESEGMENT90 ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVSI,0MOVCL,LENMOVBL,0AGAIN:MOVAL,BUF[SI]CMPAL,BUF[SI+1]JNEKL1INCBL;BL中存放的是当前重复数的个数MOVBH,AL;BH中存放的是当前重复的那个数JMPKL2KL1:CMPCOUNT,BL;重复次数最多的放在COUNT中JAEL2MOVCOUNT,BLMOVNUM,BH;保留重复次数最多的那个数MOVBL,0;要将BL置0,用于存放下一个重复数;的个数KL2:INCSILOOPAGAININCCOUNT;COUNT中是重复的次数,出现次数;应该是重复次数加1LEADX,MMMOVAH,9INT21HMOVDL,COUNTADDDL,30HMOVAH,2INT21HMOVAH,4CH91 INT21HCODEENDSENDSTART92 试卷二参考答案一、选择题1C2C3A4C5A6A7A8C9B10C11B12D13D14D15B16A17A18B19A20D二、阅读题1.AXCX(也可以用十进制数表示)67C13H14H27H1EH45H2.((X+Y)*8-(X-Y)*2)/163.Y=∑AI*BI,I=1—8(用中文表示也可以)Y=204三、编程题1.CSEGSEGMENTASSUMECS:CSEGSTART:MOVAX,DSEGMOVDS,AXMOVBX,9LP:MOVCX,BXLOP:MOVDL,"*"MOVAH,2INT21HLOOPLOPMOVAH,02HMOVDL,0AH93 INT21HMOVDL,0DHINT21HDECBXDECBXCMPBX,1JGELPMOVAL,0MOVAH,4CHINT21HCSEGENDSENDSTART2.DATASEGMENTBUFDB0,-1,2,4,3,-4,5,6,-7,0RESULTDB0;存放0的个数DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,0;计数0的个数LEASI,BUFMOVCX,10LOP:CMPBYTEPTR[SI],0JNEAL3INCAL;0的个数AL3:INCSILOOPLOPMOVDL,ALADDDL,30H94 MOVAH,02HINT21HMOVRESULT,ALMOVAH,4CHINT21HCODEENDSENDSTART3.DATASEGMENTBUF1DB"IAMASTUDENT!","$"LEN1=$-BUF1BUF2DB"EWFHEFNFN","$"LEN2=$-BUF2MDB13,10,"$"DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXLEASI,BUF1MOVCX,LEN1CALLCMMPLEASI,BUF2MOVCX,LEN2CALLCMMPMOVAH,4CHINT21H;子程序的功能:搜索字符串中是否有N字符,如果有用Y替代,并显示字符串;入口参数为字符串偏移地址SI,字符串长度CXCMMPPROCMOVDX,SI95 ;将要显示的字符串的偏移地址送DX,用于显示字符串。这句应在子程序的开始,因为下面语句会改变SI的值BL1:CMPBYTEPTR[SI],"N"JNZBL2MOVAL,"Y"MOV[SI],ALBL2:INCSILOOPB11MOVAH,09H;显示字符串INT21HLEADX,MINT21HRETCMMPENDPCODEENDSENDSTART96 试卷三参考答案一、单项选择题1.B2.C3.C4.D5.B6.B7.B8.C9.A10.B11.D12.B13.A14.B15.C16.C17.D18.A19.D20.D二、填空题1.1MB00000HFFFFFH2.机器汇编语言3.段地址偏移地址4.段属性SEG偏移地址属性OFFSET类型属性TYPE5.CFOF6.8000H7FFFH三、简答题1.BUFFERDB2DUP(1,2DUP(2,3),4)2.A)MOVBX,OFFSETVARWB)MOVCX,VARWC)MOVBX,TYPEVARW3.2000H00H2001H01H2002H00H2003H02H2004H04H2005H20H2006H00H2007H03H2008H08H2009H20H四、程序分析题1.AX=0100H,CF=12.AX=0000HCF=0(当BX=0时),CF=1(当BX不等于0时)3.该程序执行后,存储单元BUF的内容为0F000H,即该程序段完成:-32768/8=-409697 4.(1)该程序完成的功能是从32个有符号数中找出最小数→RESULT单元;(2)该程序的循环次数是1FH(或31)5.(1)该程序所完成的功能可用算术表达式表示为:CX←1+2ⅹ3+3ⅹ4+4ⅹ5+5ⅹ6+6ⅹ7;(2)程序运行后CX=6FH(或111)五、程序填空题1.对该程序所要求补充的指令分别是:MOVAL,[SI]DAAADCAL,[DI+1]2.CMPAL,‘$’SUBAL,20HMOVDL,AL六、程序设计题1.START:MOVAX,DAT1MOVDX,DAT2ORDX,DXJNSNEXTNOTAXNOTDXADDAX,1ADCDX,0NEXT:MOVABS1,AXMOVABS1,DXHLT2.DATASEGMENTADDRDW1275H,4652H,0034H,4CBAH,1FF0H,…KEYDW0034HDATAENDSCODESEGMENTASSUMECS:CODE,DS:DTAT,ES:DATA98 DELULPROCFARPUSHDSXORAX,AXPUSHAXMOVAX,DATAMOVDS,AXMOVES,AXLEADI,ADDRPUSHDIMOVAX,KEYMOVCX,ES:[DI]ADDDI,2CLDREPNZSCASWJZDELETPOPDIJMPEXITDELET:JCXZNEXTDEL:MOVBX,ES:[DI]MOVES:[DI-2],BXADDDI,2LOOPDELNEXT:POPDIDECWORDPTRES:[DI]EXIT:RETDELULENDPCODEENDSEND99 参考文献[1]曹加恒等.新一代汇编语言课程设计.北京:高等教育出版社,2003[2]龚尚福等.微型计算机汇编语言课程设计.西安:西安电子科技大学出版社,2003[3]李珍香等.汇编语言课程设计案例精编.北京:中国水利水电出版社,2004[4]王爽.汇编语言.北京:清华大学出版社,2003[5]张维勇.汇编语言程序设计自考应试指导.南京:南京大学出版社,2000[6]罗万钧.汇编语言程序设计教学辅导与上机实验指导.西安:西安电子科技大学出版社,1998[7]李兆凤.8088/8086汇编语言程序设计.北京:中央广播大学出版社,1993[8]杨路明.汇编语言程序设计.长沙:中南大学出版社,2005100'