收藏 分销(赏)

微机原理课后第39题.doc

上传人:xrp****65 文档编号:9432097 上传时间:2025-03-26 格式:DOC 页数:14 大小:88.50KB
下载 相关 举报
微机原理课后第39题.doc_第1页
第1页 / 共14页
微机原理课后第39题.doc_第2页
第2页 / 共14页
点击查看更多>>
资源描述
39.(上机题)编写程序实现下列5项功能,通过从键盘输入1~5进行菜单式选择: (1)按数字键“1”,完成将字符串中的小写字母变换成大写字母。用户输入由英文大 小写字母或数字0~9组成的字符串(以回车结束),变换后按下列格式在屏幕上显示: <原字符串>例如:abcdgyt0092 <新字符串> ABCDGYT0092 按任一键重做;按Esc键返回主菜单。 (2)按数字键“2”,完成在字符串中找最大值。用户输入由英文大小写字母或数字 0~9 组成的字符串(以回车结束),找出最大值后按下列格式在屏幕上显示: <原字符串> The maximum is <最大值>. 按任一键重做;按Esc键返回主菜单。 (3)按数字键“3”,完成输入数据组的排序。用户输入一组十进制数值(小于255), 然后变换成十六进制数,并按递增方式进行排序,按下列格式在屏幕上显示: <原数值串> <新数值串> 按任一键重做;按Esc键返回主菜单。 (4)按数字键“4”,完成时间的显示。首先提示用户对时,即改变系统的定时器 HH:MM:SS(以冒号间隔,回车结束),然后在屏幕的右上角实时显示出时 间:HH:MM:SS。 按任一键重新对时;按Esc键返回主菜单。 (5)按数字键“5”,结束程序的运行,返回操作系统。 解: ※ 主程序的编程思路: 四、程序代码 STACK SEGMENT STACK DB 256 DUP(?) TOP LABELWORD STACK ENDS DATA SEGMENT TABLE DW G1, G2, G3, G4, G5 STRING1 DB '1. Change small letters into capital letters of string;', 0DH, 0AH, '$' STRING2 DB '2. Find the maximum of string;', 0DH, 0AH, '$' STRING3 DB '3. Sort for datas;', 0DH, 0AH, '$' STRING4 DB '4. Show Time;', 0DH, 0AH, '$' STRING5 DB '5. Exit.', 0DH, 0AH, '$' STRINGN DB 'Input the number you select (1-5) : $' IN_STR DB 'Input the string (including letters & numbers, less than 60 letters) :', 0DH, 0AH, '$' PRESTR DB 'Original string : $' NEWSTR DB 'New string : $' OUT_STR DB 'The string is $' MAXCHR DB 'The maximum is $' IN_NUM DB 'Input the numbers (0 - 255, no more than 20 numbers) : ', 0DH, 0AH, '$' OUT_NUM DB 'Sorted numbers : ', 0DH, 0AH, '$' IN_TIM DB 'Correct the time (HH:MM:SS) : $' HINTSTR DB 'Press ESC, go back to the menu; or press any key to play again!$' KEYBUF DB 61 DB ? DB 61 DUP (?) NUMBUF DB ? DB 20 DUP (?) DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK START: MOVAX, DATA MOV DS, AX MOVAX, STACK MOV SS, AX MOV SP, OFFSET TOP MAIN: CALL FAR PTR MENU ; 设置显示器 AGAIN: MOVAH, 2 MOV BH, 0 ; 页号 MOV DL, 41 ; 列号 MOV DH, 10 ; 行号 INT 10H ; 光标位置设置 MOVAH, 1 INT 21H CMPAL, '1' JB AGAIN CMPAL, '5' JAAGAIN SUB AL, '1' ; N-1 SHLAL, 1 ; (N-1)*2 CBW ; AL->AX LEA BX, TABLE ADD BX, AX JMPWORD PTR [BX] G1: CALL FAR PTR CHGLTR MOVAH, 8 INT 21H CMPAL, 1BH JZ MAIN JMP G1 G2: CALL FAR PTR MAXLTR MOVAH, 8 INT 21H CMPAL, 1BH JZ MAIN JMP G2 G3: CALL FAR PTR SORTNUM MOVAH, 8 INT 21H CMPAL, 1BH JZ MAIN JMP G3 G4: CALL FAR PTR TIMCHK MOVAH, 8 INT 21H CMPAL, 1BH JZ MAIN JMP G4 G5: MOVAH, 4CH INT 21H MENU PROC FAR ; 显示主界面 ;设置显示器方式 MOVAH, 0 MOVAL, 3; MOV BL, 0; INT 10H ; 清屏 MOVAH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 5 ; 行号 INT 10H ; 光标位置设置 MOVAH, 9 LEA DX, STRING1 INT 21H MOVAH, 2 MOV DL, 5 ; 列号 MOV DH, 6 ; 行号 INT 10H ; 光标位置设置 MOVAH, 9 LEA DX, STRING2 INT 21H MOVAH, 2 MOV DL, 5 ; 列号 MOV DH, 7 ; 行号 INT 10H ; 光标位置设置 MOVAH, 9 LEA DX, STRING3 INT 21H MOVAH, 2 MOV DL, 5 ; 列号 MOV DH, 8 ; 行号 INT 10H ; 光标位置设置 MOVAH, 9 LEA DX, STRING4 INT 21H MOVAH, 2 MOV DL, 5 ; 列号 MOV DH, 9 ; 行号 INT 10H ; 光标位置设置 MOVAH, 9 LEA DX, STRING5 INT 21H MOVAH, 2 MOV DL, 5 ; 列号 MOV DH, 10 ; 行号 INT 10H ; 光标位置设置 MOVAH, 9 LEA DX, STRINGN INT 21H RET MENU ENDP CHGLTR PROC FAR ; 将输入字符串中小写字母便换成大写字母 RECHG: ;设置显示器方式 MOVAH, 0 MOVAL, 3 MOV BL, 0 INT 10H ; 清屏 MOVAH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 5 ; 行号 INT 10H ; 输入提示光标位置设置 MOVAH, 9 LEA DX, IN_STR INT 21H ; 输入字符串提示 MOVAH, 2 MOV DL, 5 ; 列号 MOV DH, 6 ; 行号 INT 10H ; 输入字符串光标位置设置 MOVAH, 0AH LEA DX, KEYBUF INT 21H ; 输入字符串 CMP KEYBUF + 1, 0 JZ RECHG ; 判断输入字符串是否为空串 LEA BX, KEYBUF + 2 MOVAL, KEYBUF + 1 CBW MOV CX, AX ADD BX, AX MOV BYTE PTR [BX], '$' ; 在输入字符串尾加结束标志$ MOVAH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 7 ; 行号 INT 10H ; 源字符串提示光标位置设置 MOVAH, 9 LEA DX, PRESTR INT 21H ; 输出源字符串提示 MOVAH, 9 LEA DX, KEYBUF + 2 INT 21H ; 输出源字符串 LEA BX, KEYBUF + 2 LCHG: CMP BYTE PTR [BX], 61H JB NOCHG AND BYTE PTR [BX], 0DFH NOCHG: INC BX LOOP LCHG ; 将字符串中小写字母转换成大写字母 MOVAH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 8 ; 行号 INT 10H ; 新字符串提示光标位置设置 MOVAH, 9 LEA DX, NEWSTR INT 21H ; 输出新字符串提示 MOVAH, 9 LEA DX, KEYBUF + 2 INT 21H ; 输出新字符串 MOVAH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 9 ; 行号 INT 10H ; 提示信息光标位置设置 MOVAH, 9 LEA DX, HINTSTR INT 21H ; 输出提示信息 RET CHGLTR ENDP MAXLTR PROC FAR ; 在输入字符串中找出最大值 REMAX: ;设置显示器方式 MOVAH, 0 MOVAL, 3 MOV BL, 0 INT 10H ; 清屏 MOVAH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 5 ; 行号 INT 10H ; 输入提示光标位置设置 MOVAH, 9 LEA DX, IN_STR INT 21H ; 输入字符串提示 MOVAH, 2 MOV DL, 5 ; 列号 MOV DH, 6 ; 行号 INT 10H ; 输入字符串光标位置设置 MOVAH, 0AH LEA DX, KEYBUF INT 21H ; 输入字符串 CMP KEYBUF + 1, 0 JZ REMAX ; 判断输入字符串是否为空串 LEA BX, KEYBUF + 2 MOVAL, KEYBUF + 1 CBW MOV CX, AX ADD BX, AX MOV BYTE PTR [BX], '$' ; 在输入字符串位加结束标志$ MOVAH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 7 ; 行号 INT 10H ; 源字符串提示光标位置设置 MOVAH, 9 LEA DX, OUT_STR INT 21H ; 输出字符串提示 MOVAH, 9 LEA DX, KEYBUF + 2 INT 21H ; 输出字符串 MOVAH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 8 ; 行号 INT 10H ; 新字符串提示光标位置设置 MOVAH, 9 LEA DX, MAXCHR INT 21H ; 输出字符串中最大值提示 MOV DL, 0 LEA BX, KEYBUF + 2 LCMP: CMP [BX], DL JB NOLCHG MOV DL, [BX] NOLCHG: INC BX LOOP LCMP ; 找出字符串中最大字符,放入DL MOVAH, 2 INT 21H ; 输出字符串中最大字符 MOVAH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 9 ; 行号 INT 10H ; 提示信息光标位置设置 MOVAH, 9 LEA DX, HINTSTR INT 21H ; 输出提示信息 RET MAXLTR ENDP SORTNUM PROC FAR ; 对输入数据组排序 RESORT: ;设置显示器方式 MOVAH, 0 MOVAL, 3 MOV BL, 0 INT 10H ; 清屏 MOVAH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 5 ; 行号 INT 10H ; 输入提示光标位置设置 MOVAH, 9 LEA DX, IN_NUM INT 21H MOVAH, 2 MOV DL, 5 ; 列号 MOV DH, 6 ; 行号 INT 10H ; 输入数据组光标位置设置 MOVAH, 0AH LEA DX, KEYBUF INT 21H ; 输入数据组字符串 CALL CIN_INT ; 字符串转换成数据串 CMPAL, 0 JZ RESORT ; 判断数据串是否有错 CMP NUMBUF, 0 JZ RESORT ; 判断数据串是否为空 MOVAH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 7 ; 行号 INT 10H ; 输出提示光标位置设置 MOVAH, 9 LEA DX, OUT_NUM INT 21H ; 输出数据串提示 MOVAH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 8 ; 行号 INT 10H ; 输出数据组光标位置设置 CALL FAR PTR MPSORT ; 数据组排序 CALL FAR PTR INT_OUT ; 数据组的输出 MOVAH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 9 ; 行号 INT 10H ; 提示信息光标位置设置 MOVAH, 9 LEA DX, HINTSTR INT 21H ; 输出提示信息 RET SORTNUM ENDP CIN_INTPROC NEAR ; 读入整型数 ; 入口参数:无 ; 出口参数为:AL(有无错误标志,0为有,1为无) MOV CL, KEYBUF + 1 LEA SI, KEYBUF + 2 MOV CH, 0 ; 数据组数据个数置0 MOV DH, 10 MOVAL, 0 ; 当前数据x=0 MOV DL, 0 ; 有无数据标志置0,即无数据 FNDNUM: CMP BYTE PTR [SI], ' ' JZ ADDNUM ; 判断当前字符是否为空格 CMP BYTE PTR [SI], '0' JB ERRNUM CMP BYTE PTR [SI], '9' JA ERRNUM ; 判断当前字符是否在'0'-'9'之间 MOV DL, 1 ; 有无数据标志置1,即有数据 MULDH XOR BH, BH MOV BL, [SI] ADD AX, BX SUB AX, '0' ; 计算出当前数据x CMPAH, 0 JA ERRNUM ; 判断x 是否越界 JMP NEXT ADDNUM: CMP DL, 1 JNZ NEXT ; 判断是否有数据 INC CH ; 数据组数据个数加1 CALLADDNEW MOV DL, 0 MOVAL, 0 ; 清零 NEXT: INC SI DEC CL CMP CL, 0 JNZ FNDNUM ; 依次检查各字符 CMP DL, 1 JNZ TOTAL ; 判断是否有未加入的数据 INC CH CALLADDNEW TOTAL: MOV NUMBUF, CH ; 置数据组数据个数 MOVAL, 1 ; 输入数据无错误 JMP CRTNUM ERRNUM: MOVAL, 0 ; 输入数据有错误 CRTNUM: RET CIN_INT ENDP ADDNEW PROC NEAR ; 增加新数 ; 入口参数:CH(数据组数据个数)、AL(当前数据x) ; 出口参数:无 PUSH AX LEA BX, NUMBUF MOVAL, CH CBW ADD BX, AX POPAX MOV [BX], AL RET ADDNEW ENDP MPSORT PROC FAR ; 数据组排序 MOVAL, NUMBUF CMPAL, 1 JBE NOSORT ; 若只有一个元素,停止排序 CBW MOV CX, AX LEA SI, NUMBUF ; SI指向数据组首地址 ADD SI, CX ; SI指向数据组末地址 DEC CX ; 外循环次数 LP1: ; 外循环开始 PUSH CX PUSH SI MOV DL, 0 ; 交换标志置0 LP2: ; 内循环开始 MOVAL, [SI] CMPAL, [SI - 1] JAE NOXCHG XCHG AL, [SI - 1] ; 交换操作 MOV [SI], AL MOV DL, 1 ; 交换标志置1 NOXCHG: DEC SI LOOP LP2 POP SI POP CX CMP DL, 1 JNZ NOSORT ; 判断交换标志 LOOP LP1 NOSORT:RET MPSORTENDP INT_OUT PROC FAR ; 输出数据组 MOVAL, NUMBUF CBW MOV CX, AX MOV BL, 10H LEA SI, NUMBUF + 1 PRINT: MOVAL, [SI] CALL OUTNUM INC SI MOVAH, 2 MOV DL, ' ' INT 21H LOOP PRINT RET INT_OUT ENDP OUTNUM PROC NEAR ; 将十进制数以十六进制输出 ; 入口参数:AL(待转换的数据),BL(转换进制数16) ; 出口参数:无 MOVAH, 0 DIV BL PUSH AX CMPAH, 10 JB PNUM ADD AH, 7 PNUM: ADD AH, 30H MOV DL, AH POPAX PUSH DX CMPAL, 0 JZ OUTN CALL OUTNUM OUTN: POPDX MOVAH, 2 INT 21H RET OUTNUM ENDP TIMCHK PROC FAR ; 设定并显示时间 ;设置显示器方式 MOVAH, 0 MOVAL, 3; MOV BL, 0; INT 10H ; 清屏 MOVAH, 2 MOV BH, 0 ; 页号 MOV DL, 5 ; 列号 MOV DH, 6 ; 行号 INT 10H ; 设置提示光标位置设置 MOVAH, 9 LEA DX, IN_TIM INT 21H ; 时间串提示 MOVAH, 0AH LEA DX, KEYBUF INT 21H ; 输入时间串 MOV BL, 10 MOVAL, KEYBUF + 2 SUB AL, '0' MUL BL ADD AL, KEYBUF + 3 SUB AL, '0' CMPAL, 0 JB INVALID CMPAL, 24 JAE INVALID ; 判断时 有效性 MOV CH, AL MOVAL, KEYBUF + 5 SUB AL, '0' MUL BL ADD AL, KEYBUF + 6 SUB AL, '0' CMPAL, 0 JB INVALID CMPAL, 60 JAE INVALID ; 判断分 有效性 MOV CL, AL MOVAL, KEYBUF + 8 SUB AL, '0' MUL BL ADD AL, KEYBUF + 9 SUB AL, '0' CMPAL, 0 JB INVALID CMPAL, 60 JAE INVALID ; 判断秒 有效性 MOV DH, AL MOV DL, 0 MOVAH, 2DH INT 21H ; 置系统时间 INVALID: CALL TIME RET TIMCHK ENDP TIME PROC ; 显示时间子程序 ;设置显示器方式 MOVAH, 0 MOVAL, 3; MOV BL, 0; INT 10H ; 清屏 MOVAH, 2 MOV BH, 0 ; 页号 MOV DL, 10 ; 列号 MOV DH, 9 ; 行号 INT 10H ; 提示信息光标位置设置 MOVAH, 9 LEA DX, HINTSTR INT 21H ; 输出提示信息 DISP1: MOVAH, 2 MOV BH, 0 ; 页号 MOV DL, 72 ; 列号 MOV DH, 0 ; 行号 INT 10H ; 提示光标位置设置 MOVAH, 2CH ; 取系统时间,CH,CL,DH 分别存放时/分/秒 INT 21H MOVAL, CH ; 显示时 CALL SHOWNUM MOVAH, 2 MOV DL, ':' INT 21H MOVAL, CL ; 显示分 CALL SHOWNUM MOVAH, 2 MOV DL, ':' INT 21H MOVAL, DH ; 显示: 秒 CALL SHOWNUM MOVAH,02H ; 设置光标位置 MOV DX,090AH MOV BH,0 INT 10H MOV BX,0018H RE: MOV CX,0FFFFH ; 延时 REA: LOOP REA DEC BX JNZ RE MOVAH, 0BH ; 或MOVAH, 01H INT 21H ; INT 16H CMPAL, 0 ; JE DISP1 JZ DISP1 ; 检查键盘状态 RET TIME ENDP SHOWNUM PROC ; 把AL中的数字以十进制输出 ; 入口参数:AL(待显示的数据) ; 出口参数:无 CBW PUSH CX PUSH DX MOV CL, 10 DIV CL ADD AH, '0' MOV BH, AH ADD AL, '0' MOVAH, 2 MOV DL, AL INT 21H MOV DL, BH INT 21H POPDX POP CX RET SHOWNUM ENDP CODE ENDS END START 五、实验结果 运行程序。 主菜单界面,如图5-1。 图5-1 主菜单界面
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服