您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > 山东大学汇编实验三实验报告
实验三DOS和BIOS中断功能调用一、实验目的1.掌握DOS系统提供的DOS和BIOS功能调用方法。2.巩固汇编语言程序编写方法。二、实验任务1.在屏幕上建立一个10行20列的小窗口,先清窗口,然后在窗口的最后一行行首输入字符串“Youarewelcome!”,向上滚一行,重复此过程,直到整个窗口显示完毕。程序代码:.modelsmall.stack.codeEsc_keyequ1bh;退出程序win_ulcequ30;屏幕左上角的列数win_ulrequ8;屏幕左上角的行数win_lrcequ50;屏幕右下角的列数win_lrrequ17;屏幕右下角的行数mainprocfarmovah,6;清屏功能moval,0movbh,7movch,0movcl,0movdh,24movdl,79int10hmovdx,0;光标设置功能movah,2int10hlocate:movah,2;将光标设为最下面一行的左端movdh,win_lrrmovdl,win_ulcmovbh,0int10hmovcx,16d;循环15次输入时上滚get_char:;输入字符movah,1;当输入“youarewelcome!”时,即15个字符时上滚int21hcmpal,Esc_key;输入esc时退出程序jzexitloopget_charmovah,6;屏幕上卷功能moval,1movch,win_ulrmovcl,win_ulcmovdh,win_lrrmovdl,win_lrcmovbh,7int10hjmplocateexit:;退出程序movax,4c00hint21hmainendpendmain程序运行截图:2.完成DOS系统time命令功能,先将当前时间(时值:分值)显示出来,再提示输入更改的时间(时值:分值),并完成新时间的设置。程序代码:;------------------------------------------------------------------CODESEGMENTASSUMECS:CODE,DS:CODE,ES:CODEORG100H;------------------------------------------------------------------BEGIN:JMPSTARTTIMESTRDB'00:00','$'HOURDB00HMINDB00HNOW_STRDB0DH,0AH,'Currenttimeis','$'INPUT_STRDB0DH,0AH,'Enternewtime(hh:mm):','$'ERRMSGDB0DH,0AH,'Cannotsetnewtime.','$'OKMSGDB0DH,0AH,'OK.','$'NEW_LINEDB0DH,0AH,'$';------------------------------------------------------------------;主程序开始START:MOVAX,CSMOVDS,AX;设置DS与CS相同。(数据段与代码段相同)CALLGET_TIME_TO_BUFF;取系统时间到HOUR和MINCALLNUM_TO_STR;转换数值HOUR和MIN到ASCII码形式TIMESTR。CALLDISP_TIME_STR;显示当前时间CALLINPUT_TIME_STR;接收键盘输入新的时间到TIMESTR。CALLSTR_TO_NUM;转换ASCII码形式TIMESTR到数值HOUR和MIN。CALLSET_TIME;按HOUR和MIN设置系统时间。;CALLGET_TIME_TO_BUFF;CALLNUM_TO_STR;转换数值HOUR和MIN到ASCII码形式TIMESTR。;CALLDISP_TIME_STRMOVAH,4cH;带返回码终止,AL=返回码INT21H;主程序至此结束;------------------------------------------------------------------GET_TIME_TO_BUFFPROCNEAR;取系统时间到HOUR和MINMOVAH,2CHINT21HMOVBX,OFFSETHOURMOV[BX],CHMOVBX,OFFSETMINMOV[BX],CLRETGET_TIME_TO_BUFFENDP;------------------------------------------------------------------NUM_TO_STRPROCNEAR;转换数值HOUR和MIN到ASCII码形式TIMESTR。MOVAL,HOURMOVAH,00HMOVCL,10DIVCLADDAL,'0';小时的十位ADDAH,'0';小时的个位MOVBX,OFFSETTIMESTRMOV[BX],ALINCBXMOV[BX],AHMOVAL,MINMOVAH,00HMOVCL,10DIVCLADDAL,'0';分钟的十位ADDAH,'0';分钟的个位MOVBX,OFFSETTIMESTRINCBXINCBXINCBXMOV[BX],ALINCBXMOV[BX],AHRETNUM_TO_STRENDP;------------------------------------------------------------------DISP_TIME_STRPROCNEAR;显示当前时间MOVAH,09H;09显示字符串MOVDX,OFFSETNOW_STRINT21HMOVAH,09HMOVDX,OFFSETTIMESTRINT21HRETDISP_TIME_STRENDP;------------------------------------------------------------------INPUT_TIME_STRPROCNEAR;接收键盘输入新的时间到TIMESTR。MOVAH,09HMOVDX,OFFSETINPUT_STRINT21H;显示输入提示MOVCL,00H;输入的字符个数计数器清0MOVBX,OFFSETTIMESTR;输入的字符存放位置INPUT_LOOP:MOVAH,1H;从键盘输入并回显07键盘输入无回显INT21H;接受一个字符MOV[BX],AL;保存这个字符到TIMESTRINCBXINCCLCMPCL,05H;是否输入了5个字符JLINPUT_LOOPMOVAH,09HMOVDX,OFFSETNEW_LINE;让屏幕换行INT21HRETINPUT_TIME_STRENDP;------------------------------------------------------------------STR_TO_NUMPROCNEAR;转换ASCII码形式TIMESTR到数值HOUR和MIN。MOVBX,OFFSETTIMESTRMOVAL,[BX];小时的十位SUBAL,'0'MOVCH,10MULCHMOVCL,ALINCBXMOVAL,[BX];小时的个位SUBAL,'0'ADDAL,CLMOVHOUR,ALINCBXINCBXMOVAL,[BX];分钟的十位SUBAL,'0'MOVCH,10MULCHMOVCL,ALINCBXMOVAL,[BX];分钟的个位SUBAL,'0'ADDAL,CLMOVMIN,ALRETSTR_TO_NUMENDP;------------------------------------------------------------------SET_TIMEPROCNEAR;按HOUR和MIN设置系统时间。MOVCH,HOURMOVCL,MINMOVDH,00HMOVDL,00HMOVAH,2DH;2DH动能调用,系统时间。INT21HCMPAL,0FFH;如果AL=0FFH,则表示出错。JNESET_OK;结果不为0则转移MOVDX,OFFSETERRMSG;显示错误信息MOVAH,09HINT21HJMPSET_ENDSET_OK:MOVDX,OFFSETOKMSG;显示正确信息MOVAH,09HINT21HSET_END:RETSET_TIMEENDP;------------------------------------------------------------------CODEENDS;段结束ENDBEGIN;------------------------------------------------------------------程序运行截图:3.将从键盘输入的字符信息写到文件名为test.txt的文件中。程序代码:DATASEGMENTFILENAMEDB'TEST.TXT',0;ASCIIZ串BUFFERDB?;一个字节的写缓冲区HANDLEDW?;保存句柄单元ERROR1DB'创建文件出错',0DH,0AH,'$'ERROR2DB'写文件出错!',0DH,0AH,'$'DATAENDSCODESEGMENT'CODE'ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA;初始化DSMOVDS,AX;创建文件MOVAH,3CH;INT21H的3CH功能,创建文件MOVCX,0;设置文件属性,CX=0为普通文件LEADX,FILENAME;DX=ASCIIZ串的首地址INT21H;创建文件JCERR1;创建不成功,转ERR1显示出错信息MOVHANDLE,AX;创建成功,保存文件句柄;从键盘接收字符,写入文件中LOP1:MOVAH,1;INT21H的1号功能INT21H;从键盘接收一个字符CMPAL,0DH;判断是否为结束的回车符JZEXIT2;是,结束MOVBUFFER,AL;不是,保存到写文件缓冲区BUFFER中;将缓冲区中内容写到文件中MOVAH,40H;INT21H的40H功能,写文件MOVBX,HANDLE;BX=文件句柄MOVCX,1;CX=要写入的字节数LEADX,BUFFER;DX=写缓冲区首地址INT21H;把缓冲区内容写入文件JCERR2;写错,转ERR2显示出错信息JMPLOP1;写成功,返回继续接收字符;关闭文件EXIT2:MOVAH,3EH;INT21H的功能3EH,关闭文件MOVBX,HANDLE;BX=文件句柄INT21H;关闭文件EXIT1:MOVAX,4C00H;返回DOSINT21HERR1:MOVAH,9;显示创建文件出错信息LEADX,ERROR1INT21HJMPEXIT1;返回DOSERR2:MOVAH,9;显示写文件出错信息LEADX,ERROR2INT21HJMPEXIT2CODEENDSENDSTART程序运行截图:4.完成DOS系统type命令功能,屏幕显示输入文件名的提示信息,再读取指定的文本文件,然后在屏幕上显示该文本文件的内容。程序代码:DATASEGMENTFNAMEDB40,41DUP(?)FCONTENTSDB256DUP('$')ASK1DB'INPUTFILENAME:$'ERRDB0AH,0DH,'ERROR$'DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCFARMOVAX,DATA;MOVDS,AXLEADX,ASK1MOVAH,9;显示字符串INT21HLEADX,FNAMEMOVAH,0AH;键盘输入到缓冲区INT21HMOVCL,FNAME+1MOVCH,0MOVSI,CXMOVFNAME[SI+2],0LEADX,FNAME+2MOVAH,3DH;打开文件MOVAL,0INT21HJNCRFILEERRMSG:LEADX,ERRMOVAH,9INT21HMOVAH,4CH;;带返回码终止INT21HRFILE:MOVBX,AXLEADX,FCONTENTSMOVCX,256MOVAH,3FH;读文件或者设备INT21HJCERRMSGCALLCRL
本文标题:山东大学汇编实验三实验报告
链接地址:https://www.777doc.com/doc-2477606 .html