华工微机实验报告实验四子程序的调用.docx
- 文档编号:11706949
- 上传时间:2023-03-30
- 格式:DOCX
- 页数:25
- 大小:300.46KB
华工微机实验报告实验四子程序的调用.docx
《华工微机实验报告实验四子程序的调用.docx》由会员分享,可在线阅读,更多相关《华工微机实验报告实验四子程序的调用.docx(25页珍藏版)》请在冰豆网上搜索。
华工微机实验报告实验四子程序的调用
实验报告
课程名称
微型计算机原理及其应用
实验项目
子程序设计
学生姓名
朱轲信
学生学号
201530281598
专业/班级
信息工程冯秉铨实验班
实验成绩
电子与信息学院实验中心制
二〇一七年版
预习报告
一、实验目的
1、学习子程序的定义和调用方法。
2、掌握子程序、子程序嵌套的结构。
3、掌握子程序的程序设计、编制及调试方法。
二、实验设备
微机一台、TDS-MD微机一台
三、实验内容及步骤
程序采用菜单式选择,可接收用户输入的命令(1~5),各命令如下:
按1键完成字符串小写字母变大写字母
用户输入一由英文大小写字母或数字0~9组成的字符串(以回车结束),程序逐个检查字符串中各字符,将原串中小写字母变成大写字母,其它字符不变,并在屏幕上显示。
用户按任一键,重做,按ESC键,返回主菜单。
按2键完成找最大值(二选一)
1、接收用户输入的可显示字符串(以回车结束),程序将其中ASCII码值最大的字符显示出来。
2、接收用户输入若干无符号8位数(以空格或逗号为分隔符,以回车结束),程序将其中最大的数显示出来。
用户按任一键,重做,按ESC键,返回主菜单。
按3键完成排序(二选一)
1、接收用户输入的可显示字符串,以回车结束。
程序按ASCII码值大小由大到小排序并输出显示。
2、接收用户输入若干个有符号8位数(以空格逗号为分隔符,以回车结束)。
程序将其中最大的数显示出来。
用户按任一键,重做,按ESC键,返回主菜单。
按4键显示时间
首先提示用户对时,即用户输入时,分,秒(以空格或冒号分隔,以回车结束),然后,在屏幕上不断显示时间,格式为:
××(时):
××(分):
××(秒),最好定点显示。
用户按任一键,重新对时,按ESC键,返回主菜单。
按5键,结束程序运行,返回系统提示符。
四、流程图与程序代码
流程图:
流程图1—主菜单
流程图2--过程一流程图3—过程二
流程图4—过程三流程图5—过程四
代码:
STACKSEGMENTSTACK'STACK'
DW100DUP(?
)
TOPLABELWORD
STACKENDS
DATASEGMENT
ORG3500H
;数据段主要保存一些字符串以及定义一些字符串变量
COPYRIGHTDB'-------ALLPROGRAMEDBY@MRZHU--------',0DH,0AH,'$'
COMMONDB'Pleaseinput1to5toselectafunction',0DH,0AH,'$'
S1DB'1.Inputastring,thenconvertthesmallletterstobigletters',0DH,0AH,'$'
S2DB'2.Findthebiggest-ASCII-codecharacter',0DH,0AH,'$'
S3DB'3.SortthecharacterbyASCIIcodebydecreasingorder',0DH,0AH,'$'
S4DB'4.displaythetickingtime',0DH,0AH,'$'
S5DB'5.Exittheprogram',0DH,0AH,'$'
CR_LFDB0DH,0DH,'$'
IN_MAINDB'Nowinputanumber(1-5):
','$'
MAIN_ERRORDB0DH,0AH,'ERROR:
Pleaseinputacorrectnumber;',0DH,0AH,'$'
PRO_1_S1DB0DH,0AH,'Nowinputastring(numberorletter):
',0DH,0AH,'$'
PRO_1_S2DB0DH,0AH,'Thestringhasbeenchangedto:
','$'
PRO_2_S1DB0DH,0AH,'Nowinputastring(anysymbol):
',0DH,0AH,'$'
PRO_2_S2DB0DH,0AH,'Thebiggest-ASCII-codesymbolis:
','$'
PRO_3_S1DB0DH,0AH,'Nowinputastring(anysymbol):
',0DH,0AH,'$'
PRO_3_S2DB0DH,0AH,'Thestringhasbeensorted:
','$'
PRO_4_S1DB0DH,0AH,'Settingtime(XX:
XX:
XX Minutes: Seconds>): ',0DH,0AH,'$' PRO_4_S2DB0DH,0AH,'SETTINGDONE! ',0DH,0AH,'$' PRO_4_S3DB0DH,0AH,'TIME_NOW(Pressanykeytostop): ',0DH,0AH,'$' PRO_4_ERROR_LENDB0DH,0AH,'! ! ERROR(Lengthoverflow): Pleaseinputinthecorrectformat! ',0DH,0AH,'$' PRO_4_ERROR_NOT_NUMDB0DH,0AH,'! ! ERROR(Notnumberornot": "): Pleaseinputinthecorrectformat! ',0DH,0AH,'$' PRO_4_ERROR_NUM_OVERDB0DH,0AH,'! ! ERROR(Numberoverflow): Pleaseinputthecorrectnumber! ',0DH,0AH,'$' PRO_END_SDB0DH,0AH,'PressanykeytocontinueexceptESC',0DH,0AH,'$' STRING1DB50 DB? DB50DUP(? ) STRING2DB50 DB? DB50DUP(? ) STRING3DB50 DB? DB50DUP(? ) STRING4DB50 DB? DB50DUP(? ) DATAENDS CODESEGMENT MAINPROCFAR ASSUMECS: CODE,DS: DATA,SS: STACK START: MOVAX,STACK MOVSS,AX MOVSP,OFFSETTOP PUSHDS SUBAX,AX PUSHAX;初始化堆栈 MOVAX,DATA MOVDS,AX MENU: MOVDX,OFFSETCOPYRIGHT MOVAH,9 INT21H MOVDX,OFFSETCOMMON MOVAH,9 INT21H MOVDX,OFFSETS1 MOVAH,9 INT21H MOVDX,OFFSETS2 MOVAH,9 INT21H MOVDX,OFFSETS3 MOVAH,9 INT21H MOVDX,OFFSETS4 MOVAH,9 INT21H MOVDX,OFFSETS5 MOVAH,9 INT21H MOVDX,OFFSETCR_LF MOVAH,9 INT21H IN_A_NUM: MOVDX,OFFSETIN_MAIN MOVAH,9 INT21H;显示主菜单信息 MOVAH,01H INT21H;输入一个字符 CMPAL,'1' JEP1 CMPAL,'2' JEP2 CMPAL,'3' JEP3 CMPAL,'4' JEP4 CMPAL,'5' JEP5_EXIT;判断输入的字符并跳转 MOVDX,OFFSETMAIN_ERROR MOVAH,9 INT21H JMPIN_A_NUM;其他字符时输出提醒并跳转到重新输入 P1: CALLPRO_1 MOVDX,OFFSETCR_LF MOVAH,9 INT21H;换行 JMPMENU P2: CALLPRO_2 MOVDX,OFFSETCR_LF MOVAH,9 INT21H;换行 JMPMENU P3: CALLPRO_3 MOVDX,OFFSETCR_LF MOVAH,9 INT21H;换行 JMPMENU P4: CALLPRO_4 MOVDX,OFFSETCR_LF MOVAH,9 INT21H;换行 JMPMENU P5_EXIT: RET;返回DOS MAINENDP;MAIN段结束 PRO_1PROCNEAR;过程一 PRO_1_START: MOVDX,OFFSETPRO_1_S1 MOVAH,9 INT21H;输出提示语 MOVDX,OFFSETSTRING1 MOVAH,0AH INT21H;把STRING1的字符串首地址给DX,输入一个字符串 MOVCX,0 MOVCL,STRING1[1] MOVBX,1 LOOP1: ;循环,将小写字母改为大写 INCBX MOVAL,STRING1[BX] CMPAL,61H JBNEXT1 CMPAL,7AH JANEXT1 SUBAL,20H MOVSTRING1[BX],AL NEXT1: LOOPLOOP1 INCBX MOVSTRING1[BX],'$' MOVDX,OFFSETPRO_1_S2 MOVAH,9 INT21H;输出提示的句子 MOVDX,OFFSETSTRING1[2] MOVAH,9 INT21H;输出改变后的字符串 MOVDX,OFFSETCR_LF MOVAH,9 INT21H;换行 MOVDX,OFFSETPRO_END_S;输出通用结束提示语 MOVAH,9 INT21H MOVAH,01H INT21H;输入一个字符,实现跳转的判断 CMPAL,1BH JENEXT1_2 JMPPRO_1_START;如果是ESC则不跳转到子程序开头,是则跳转 NEXT1_2: RET PRO_1ENDP PRO_2PROCNEAR;过程二 PRO_2_START: MOVDX,OFFSETPRO_2_S1;输出提示语 MOVAH,9 INT21H MOVDX,OFFSETSTRING2;把STRING2的字符串首地址给DX,接收一个字符串 MOVAH,0AH INT21H MOVCX,0 MOVCL,STRING2[1] MOVBX,1 MOVAL,0 LOOP2: INCBX CMPAL,STRING2[BX] JAENEXT2_1;AL大于等于字符ASCII值时跳转 MOVAL,STRING2[BX] NEXT2_1: LOOPLOOP2 INCBX MOVSI,BX;把BX的值放到SI,也就是指向回车的位置 MOVBL,AL;把AL放到BL,防止中断指令时破坏AL MOVDX,OFFSETPRO_2_S2 MOVAH,9 INT21H;输出提示语 MOVDL,BL MOVAH,2 INT21H;显示最大ASCII的字符 MOVDX,OFFSETPRO_END_S;输出通用结束提示语 MOVAH,9 INT21H MOVAH,01H INT21H;输入一个字符,实现跳转的判断 CMPAL,1BH JENEXT2_2 JMPPRO_2_START;如果是ESC则不跳转到子程序开头,是则跳转 NEXT2_2: RET PRO_2ENDP PRO_3PROCNEAR;过程三 PRO_3_START: MOVDX,OFFSETPRO_3_S1;输出提示语 MOVAH,9 INT21H MOVDX,OFFSETSTRING3;把STRING3的字符串首地址给DX,接收一个字符串 MOVAH,0AH INT21H MOVCX,0 MOVCL,STRING3[1];把字符串里字符个数赋给CX DECCX;实际比较的次数为CX-1 CMPCX,0 JENO_SORTED LOOP3_1: ;下面的LOOP3_1是冒泡排序 MOVBX,CX;把CX的值存到BX,防止内层循环破坏CX MOVSI,2 LOOP3_2: MOVAL,STRING3[SI] CMPAL,STRING3[SI+1] JAENEXT3_1 XCHGAL,STRING3[SI+1] XCHGAL,STRING3[SI] NEXT3_1: INCSI LOOPLOOP3_2 MOVCX,BX LOOPLOOP3_1 NO_SORTED: MOVBX,0 MOVBL,STRING3[1]; ADDBL,2 MOVSTRING3[BX],'$';将$存入改变后的字符串以作结束标志 MOVDX,OFFSETPRO_3_S2;输出提示语 MOVAH,9 INT21H MOVDX,OFFSETSTRING3[2];输出改变后的字符串 MOVAH,9 INT21H MOVDX,OFFSETPRO_END_S;输出通用结束提示语 MOVAH,9 INT21H MOVAH,01H INT21H;输入一个字符,实现跳转的判断 CMPAL,1BH JENEXT3_2 JMPPRO_3_START;如果是ESC则不跳转到子程序开头,是则跳转 NEXT3_2: RET PRO_3ENDP PRO_4PROCNEAR;过程四 PRO_4_START: MOVDX,OFFSETPRO_4_S1;输出提示语 MOVAH,9 INT21H MOVDX,OFFSETSTRING4;把STRING4的字符串首地址给DX,接收一个字符串 MOVAH,0AH INT21H MOVBX,0 MOVBL,STRING4[1]; ADDBL,2 MOVSTRING4[BX],'$';将$存入改变后的字符串以作结束标志 CALLPRO_4_IFERROR;调用判断子程序来判断是否输入了正确的格式 CMPBX,0 JEPRO_4_ERROR_1;BX=0则为长度溢出 CMPBX,1 JEPRO_4_ERROR_2;BX=1则输入的字符有误 JMPPRO_4_NO_ERROR PRO_4_ERROR_1: MOVDX,OFFSETPRO_4_ERROR_LEN;输出提示语 MOVAH,9 INT21H JMPPRO_4_START PRO_4_ERROR_2: MOVDX,OFFSETPRO_4_ERROR_NOT_NUM;输出提示语 MOVAH,9 INT21H JMPPRO_4_START PRO_4_NO_ERROR: ;下面各段把时间的ASCII转为无符号数,并判断 MOVBH,STRING4[2];对时的处理 MOVBL,STRING4[3] SUBBH,30H SUBBL,30H MOVAL,BH MOVDL,10 MULDL MOVBH,AL;BH乘以10 ADDBH,BL;BH+BL->BH将ASCII转换成无符号数 CMPBH,0 JBPRO_4_EOOOR_NUM_HR CMPBH,24 JAPRO_4_EOOOR_NUM_HR JMPPRO_4_NOERROR_NUM_HR PRO_4_EOOOR_NUM_HR: MOVDX,OFFSETPRO_4_ERROR_NUM_OVER;输出提示语 MOVAH,9 INT21H JMPPRO_4_START PRO_4_NOERROR_NUM_HR: MOVCH,BH;把BH值放入CH,即设置时的入口参数 MOVBH,STRING4[5];对分的处理 MOVBL,STRING4[6] SUBBH,30H SUBBL,30H MOVAL,BH MOVDL,10 MULDL MOVBH,AL;BH乘以10 ADDBH,BL;BH+BL->BH将ASCII转换成无符号数 CMPBH,0 JBPRO_4_EOOOR_NUM_MIN CMPBH,60 JAPRO_4_EOOOR_NUM_MIN JMPPRO_4_NOERROR_NUM_MIN PRO_4_EOOOR_NUM_MIN: MOVDX,OFFSETPRO_4_ERROR_NUM_OVER;输出提示语 MOVAH,9 INT21H JMPPRO_4_START PRO_4_NOERROR_NUM_MIN: MOVCL,BH;把BH值放入CL,即设置分的入口参数 MOVBH,STRING4[8];对秒的处理 MOVBL,STRING4[9] SUBBH,30H SUBBL,30H MOVAL,BH MOVDL,10 MULDL MOVBH,AL;BH乘以10 ADDBH,BL;BH+BL->BH将ASCII转换成无符号数 CMPBH,0 JBPRO_4_EOOOR_NUM_SEC CMPBH,60 JAPRO_4_EOOOR_NUM_SEC JMPPRO_4_NOERROR_NUM_SEC PRO_4_EOOOR_NUM_SEC: MOVDX,OFFSETPRO_4_ERROR_NUM_OVER;输出提示语 MOVAH,9 INT21H JMPPRO_4_START PRO_4_NOERROR_NUM_SEC: MOVDH,BH;把BH值放入DH,即设置秒的入口参数 MOVDL,0;初始化1/100秒 MOVAH,2DH INT21H;设置时间 MOVDX,OFFSETPRO_4_S2;输出提示语 MOVAH,9 INT21H MOVDX,OFFSETPRO_4_S3;输出提示语 MOVAH,9 INT21H LOOP4_1: ;循环显示时间 MOVAH,2CH INT21H;获取系统时间,CH: CL: DH: DLH: M: S: 1/100S Time_set: ;十六进制转ASCII码 MOVAX,0;时 MOVAL,CH MOVBL,10 DIVBL ADDAL,30H;时的高位 ADDAH,30H;时的低位 MOVSTRING4[2],AL MOVSTRING4[3],AH MOVAX,0;分 MOVAL,CL MOVBL,10 DIVBL ADDAL,30H;高位 ADDAH,30H;低位 MOVSTRING4[5],AL MOVSTRING4[6],AH MOVAX,0;秒 MOVAL,DH MOVBL,10 DIVBL ADDAL,30H;高位 ADDAH,30H;低位 MOVSTRING4[8],AL MOVSTRING4[9],AH MOVDX,OFFSETSTRING4[2] MOVAH,9 INT21H MOVDL,0DH;换行,便于下次显示 MOVAH,02H INT21H MOVAH,0BH INT21H CMPAL,0 JELOOP4_1 MOVDX,OFFSETPRO_END_S;输出通用结束提示语 MOVAH,9 INT21H MOVAH,01H INT21H;输入一个字符,实现跳转的判断 CMPAL,1BH JENEXT4_10 JMPPRO_4_START;如果是ESC则不跳转到子程序开头,是则跳转 NEXT4_10: RET PRO_4ENDP PRO_4_IFERRORPROCNEAR MOVBX,2 CMPSTRING4[1],8 JZNEXT4_1 MOVBX,0;用BX保存错误类型,并返回 RET NEXT4_1: CMPSTRING4[2],30H;检查第一个数字 JBNEXT4_2_NO_NUM CMPSTRING4[2],39H JANEXT4_2_NO_NUM JMPNEXT4_2 NEXT4_2_NO_NUM: MOVBX,1 RET NEXT4_2: CMPSTRING4[3],30H;检查第二个数字 JBNEXT4_3_NO_NUM CMPSTRING4[3],39H JANEXT4_3_NO_NUM JMPNEXT4_3 NEXT4_3_NO_NUM: MOVBX,1 RET NEXT4_3: CMPSTRING4[4],3AH;检查引号 JENEXT4_4 MOVBX,1 RET NEXT4_4: CMPSTRING4[5],30H;检查第三个数字 JBNEXT4_5_NO_NUM CMPSTRING4[5],39H JANEXT4_5_NO_NUM JMPNEXT4_5 NEXT4_5_NO_NUM: MOVBX,1 RET NEXT4_5: CMPSTRING4[6],30H;检查第四个数字 JBNEXT4_6_NO_NUM CMPSTRING4[6],39H JANEXT4_6_NO_NUM JMPNEXT4_6 NEXT4_6_NO_NUM: MOVBX,1 RET NEXT4_6: CMPSTRING4[7],3AH;检查引号 JENEXT4_7 MOVBX,1 RET NEXT4_7: CMPSTRING4[8],30H;检查第五个数字 JBNEXT4_8_NO_NUM CMPSTRING4[8],39H JANEXT4_8_NO_NUM JMPNEXT4_8 NEXT4_8_NO_NUM: MOVBX,1 RET NEXT4_8: CMP
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华工 微机 实验 报告 子程序 调用