微机大作业班级:学号:姓名:第一题:(上机题)编写程序实现下列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”,结束程序的运行,返回操作系统。
运行结果:首先进入的首页:输入1输入字符串:安任意键后:Esc 键返回菜单:输入2:输入字符串:安任意键后Ese键返回菜单输入3输入若干数:按任意键:按Esc返回主菜单输入4安1修改时间输入修改时间:按任意键重做按Esc返回主菜单输入5退出程序代码:clear_screen macro op1,op2,op3,op4 ;清屏宏定义mov ah,06h ;当前显示页上卷mov al,00h;AL=上卷行数,0 为清屏mov bh,07h;BH=填充字符属性mov ch,op1;CH/CL=上卷窗口左上角坐标mov cl,op2;mov dh,op3;DH/DL=上卷窗口右下角坐标mov dl,op4;int 10hmov ah,02h;置光标位置mov bh,00h;BH=显示页mov dh,00h;DH=行mov dl,00h;DL=列int 10hendmmenu macro op1,op2,op3 ;菜单显示宏定义mov ah,02h;置光标位置mov bh,00h;BH=显示页mov dh,op1;DH=行mov dl,op2;DL=列int 10hmov ah,09h;向屏幕显示一串字符以lea dx,op3 ;入口地址int 21hendmdata segmentSTRING11 DB '请输入字符串:$'STRING12 DB '结果:$'STRING22 DB '最大值:$'STRING31 DB '请输入0到255之间的若干数:$' STRING32 DB '新字符串:$'STRING33 DB '输入错误$'STRING41 DB '请验证时间……调整时间请按1$' STRING42 DB '请输入正确时间$'STRING43 DB '调整完毕$'STRING1 DB '1.Change lowercase to uppercase $' STRING2 DB '2.Find the maxmum $'STRING3 DB '3.Rank the array incrementally $' STRING4 DB '4.Display time $'STRING5 DB '5.return to operating system $' STRING DB '输入任意键,重新操作,Esc键退出$'KEY1 DB 100DB ?DB 100 DUP(?)NUMBUF DB 100DB ?DB 100 DUP(?)VAR DB 100 DUP(?)GAO DB 0CIGAO DB 0DIWEI DB 0SHU DB 0data endsstack segmentDW 100H DUP(?) ;input stack segment code here TOP LABEL WORDstack endscode segmentassume cs:code,ds:data,es:data,ss:stackstart:mov ax,datamov ds,axmov es,axmov ax,stackmov ss,axL1: lea sp,TOP ;input code segment code here clear_screen 00d,00d,24d,79dmenu 07h,15d,STRING1 ;输出主菜menu 09d,15d,STRING2menu 11d,15d,STRING3menu 13d,15d,STRING4menu 15d,15d,STRING5 ;mov ah,02h ;设置光标位置mov bh,00hmov dh,17dmov dl,15dint 10h ;mov ah,01h ;从键盘输入任意字符int 21hCMP AL,31HJZ L2CMP AL,32HJZ L3CMP AL,33HJZ L4CMP AL,34HJZ L5CMP AL,35HJZ L6L2: CALL CHLTOU ;11111111mov ah,01h ;从键盘输入任意字符int 21hCMP AL,1BHJZ L1JMP L2L3: CALL FINDMAX ;22222222mov ah,01h ;从键盘输入任意字符int 21hCMP AL,1BHJZ L1JMP L3L4: CALL RANK ;33333333mov ah,01h ;从键盘输入任意字符int 21hCMP AL,1BHJZ L1JMP L4L5: CALL DISPLAY ;44444444mov ah,01h ;从键盘输入任意字符int 21hCMP AL,1BHJZ L1JMP L5L6: mov ah,4chint 21hCHLTOU PROC NEARPUSH AXPUSH CXPUSH DXPUSH SIclear_screen 0d,0d,23d,78d ;清屏宏调用mov ah,02h ;设置光标位mov bh,00hmov dh,01hmov dl,0hint 10hLEA DX,STRING11 ;显示STRING11INT 21HMOV AH,0AH ;输入字符LEA DX,KEY1INT 21HLEA SI,KEY1+1XOR CX,CXMOV CL,[SI]INC SIL12:MOV AL,[SI]CMP AL,41HJB L11CMP AL,60HJB L11SUB AL,20HMOV [SI],ALL11:INC SILOOP L12MOV [SI+1],'$'CALL DISPCRMOV AH,09HLEA DX,STRING12INT 21HMOV AH,09HMOV DX,OFFSET KEY1+2INT 21HCALL DISPCRCALL DISPCRMOV AH,09H ;显示LEA DX,STRINGINT 21HPOP SIPOP DXPOP CXPOP AXRETCHLTOU ENDPFINDMAX PROC NEARPUSH AXPUSH CXPUSH DXPUSH SIclear_screen 0d,0d,23d,78d ;清屏宏调用mov ah,02h ;设置光标位mov bh,00hmov dh,01hmov dl,0hint 10hMOV AH,09HLEA DX,STRING11INT 21HMOV AH,0AHLEA DX,KEY1INT 21HLEA SI,KEY1+1XOR CX,CXMOV CL,[SI]INC SIDEC CXMOV BL,[SI]L22:CMP BL,[SI+1]JA L21XCHG BL,[SI+1]L21:INC SILOOP L22CALL DISPCRMOV AH,09HLEA DX,STRING22INT 21HMOV DL,BLMOV AH,02HINT 21HCALL DISPCRCALL DISPCRMOV AH,09H ;显示LEA DX,STRINGINT 21HPOP SIPOP DXPOP CXPOP AXRETFINDMAX ENDPRANK PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXPUSH SIPUSH DIRESORT: clear_screen 0d,0d,23d,78d ;清屏宏调用mov ah,02h ;设置光标位mov bh,00hmov dh,01hmov dl,0hint 10hMOV AH,09H ;显示LEA DX,STRING31INT 21Hcall DISPCRMOV AH,0AH;输入数据LEA DX,KEY1INT 21Hcall DISPCRCALL CIN_INT ; 字符串转换成数据串CMP AL, 0JZ RESORT ; 判断数据串是否有错CMP NUMBUF, 0JZ RESORT ; 判断数据串是否为空MOV AH,09H ;显示LEA DX,STRING32INT 21Hcall DISPCRCALL FAR PTR MPSORT ; 数据组排序CALL FAR PTR INT_OUT ; 数据组的输出call DISPCRMOV AH,09H ;显示LEA DX,STRINGINT 21HPOP DIPOP SIPOP DXPOP BXPOP AXRETRANK ENDPCIN_INT PROC NEAR ; 读入整型数; 入口参数:无; 出口参数为:AL(有无错误标志,0为有,1为无)MOV CL, KEY1 + 1LEA SI, KEY1 + 2MOV CH, 0 ; 数据组数据个数置0MOV DH, 10MOV AL, 0 ; 当前数据x=0MOV DL, 0 ; 有无数据标志置0,即无数据FNDNUM:CMP BYTE PTR [SI], ' 'JZ ADDNUM ; 判断当前字符是否为空格CMP BYTE PTR [SI], '0'JB ERRNUMCMP BYTE PTR [SI], '9'JA ERRNUM ; 判断当前字符是否在'0'-'9'之间MOV DL, 1 ; 有无数据标志置1,即有数据MUL DHXOR BH, BHMOV BL, [SI]ADD AX, BXSUB AX, '0' ; 计算出当前数据xCMP AH, 0JA ERRNUM ; 判断x是否越界JMP NEXTADDNUM:CMP DL, 1JNZ NEXT ; 判断是否有数据INC CH ; 数据组数据个数加1CALL ADDNEWMOV DL, 0MOV AL, 0 ; 清零NEXT:INC SIDEC CLCMP CL, 0JNZ FNDNUM ; 依次检查各字符CMP DL, 1JNZ TOTAL ; 判断是否有未加入的数据INC CHCALL ADDNEWTOTAL:MOV NUMBUF, CH ; 置数据组数据个数MOV AL, 1 ; 输入数据无错误JMP CRTNUMERRNUM:MOV AL, 0 ; 输入数据有错误CRTNUM:RETCIN_INT ENDPADDNEW PROC NEAR ; 增加新数; 入口参数:CH(数据组数据个数)、AL(当前数据x); 出口参数:无PUSH AXLEA BX, NUMBUFMOV AL, CHCBWADD BX, AXPOP AXMOV [BX], ALRETADDNEW ENDPMPSORT PROC FAR ; 数据组排序MOV AL, NUMBUFCMP AL, 1JBE NOSORT ; 若只有一个元素,停止排序CBWMOV CX, AXLEA SI, NUMBUF ; SI指向数据组首地址ADD SI, CX ; SI指向数据组末地址DEC CX ; 外循环次数LP1: ; 外循环开始PUSH CXPUSH SIMOV DL, 0 ; 交换标志置0LP2: ; 内循环开始MOV AL, [SI]CMP AL, [SI - 1]JAE NOXCHGXCHG AL, [SI - 1] ; 交换操作MOV [SI], ALMOV DL, 1 ; 交换标志置1 NOXCHG:DEC SILOOP LP2POP SIPOP CXCMP DL, 1JNZ NOSORT ; 判断交换标志LOOP LP1NOSORT:RETMPSORT ENDPINT_OUT PROC FAR ; 输出数据组MOV AL, NUMBUFCBWMOV CX, AXMOV BL, 10HLEA SI, NUMBUF + 1PRINT:MOV AL, [SI]CALL OUTNUMINC SIMOV AH, 2MOV DL, ' 'INT 21HLOOP PRINTRETINT_OUT ENDPOUTNUM P ROC NEAR ; 将十进制数以十六进制输出; 入口参数:AL(待转换的数据),BL(转换进制数16); 出口参数:无MOV AH, 0DIV BLPUSH AXCMP AH, 10JB PNUMADD AH, 7PNUM: ADD AH, 30HMOV DL, AHPOP AXPUSH DXCMP AL, 0JZ OUTNCALL OUTNUMOUTN:POP DXMOV AH, 2INT 21HRETOUTNUM E NDPDISPLAY PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXPUSH SIclear_screen 0d,0d,23d,78d ;清屏宏调用mov ah,02h ;设置光标位mov bh,00hmov dh,01hmov dl,0hint 10hMOV AH,09H ;显示LEA DX,STRING41INT 21HCALL DISPLAY1CALL DISPCRMOV AH,01HINT 21HCMP AL,31HJZ L41JMP L42L41 : mov ah,02h ;设置光标位mov bh,00hmov dh,02hmov dl,0hint 10hMOV AH,09HLEA DX,STRING42INT 21HMOV AH,0AHLEA DX,KEY1INT 21HMOV BL,10MOV AL,KEY1 + 2SUB AL,30HSHL AL,1SHL AL,1SHL AL,1SHL AL,1ADD AL,KEY1 + 3SUB AL,30HCMP AL,0JB L42CMP AL, 24JAE L42 ; 判断时有效性MOV CH, ALMOV AL,KEY1+5SUB AL,30HSHL AL,1SHL AL,1SHL AL,1SHL AL,1ADD AL,KEY1+6SUB AL,30HCMP AL,0JB L42CMP AL,60JAE L42 ; 判断分有效性MOV CL, ALMOV AL,KEY1 + 8SUB AL, 30HSHL AL,1SHL AL,1SHL AL,1SHL AL,1ADD AL, KEY1 + 9SUB AL,30HCMP AL,0JB L42CMP AL,60JAE L42 ; 判断秒有效性MOV DH,ALMOV DL,0MOV AH,03H; 置系统时间INT 1AHmov ah,02h ;设置光标位mov bh,00hmov dh,03hmov dl,0hint 10hMOV AH,09HLEA DX,STRING43INT 21HCALL DISPCRCALL DISPCRMOV AH,09H ;显示LEA DX,STRINGINT 21HL42 :CALL DISPLAY1POP SIPOP DXPOP CXPOP BXPOP AXRETDISPLAY ENDPDISPLAY1 PROC NEAR ;显示系统时钟PUSH AXPUSH BXPUSH CXPUSH DX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;DISPI: MOV AH,2xor bh,bhMOV DX,0045H ;DX=CURSOR=45h,表示光标定位在1行70 列INT 10H ;int10 子功能02 设置光标位置MOV AH,2INT 1AHPUSH DXPUSH CXPOP BX ;小时分钟数给BXPUSH BXCALL SHOWBYTE ;调用子程序显示小时,小时在bh中CALL SHOWCOLON ;调用子程序显示时间分隔符":"POP BXXCHG BH,BL ;分钟给bhCALL SHOWBYTE ;调用子程序显示分钟,bh是分钟数CALL SHOWCOLON ;调用子程序显示时间分隔符":"POP BX ;秒数给bhCALL SHOWBYTE ;调用子程序显示秒?mov ah,02h ;设置光标位mov bh,00hmov dh,05hmov dl,0hint 10hMOV BX,0018HRE: MOV CX,0FFFFHREA: LOOP READEC BXJNZ REMOV AH,0BHINT 21HCMP AL,0JZ DISPIPOP DXPOP CXPOP BXPOP AXRETDISPLAY1 ENDPSHOWBYTE PROC NEAR ;BCD值显示子程序,BCD值在BH中BH CBWPUSH BX ;压栈BX值,以防冲掉MOV CL,4 ;以下代码BH中BCD十位值转ASCLL码MOV AL,BHSHR AL,CLADD AL,30HCALL SHOW ;调用子程序显示AL,当前AL为时间值十位上的数值CALL CURMOVE ;调用子程序后移光标POP BX ;还原BX值MOV AL,BH ;以下代码BH中BCD个位值转ASCLL码AND AL,0FHADD AL,30HCALL SHOW ;调用子程序显示AL,当前AL为时间值个位上的数值CALL CURMOVE ;调用子程序后移光标RETSHOWBYTE ENDPSHOWCOLON PROC NEAR ;显示字符":" 子程序,用于时间分隔符MOV AL,':'CALL SHOW ;调用子程序显示":"CALL CURMOVE ;调用子程序后移光标RETSHOWCOLON ENDPCURMOVE PROC NEAR ;光标后移子程序PUSH AXPUSH BXPUSH CXPUSH DXMOV AH,3MOV BH,0INT 10H ;取光标位置INC DL ;光标列位置加1MOV AH,2INT 10H ;设光标位置POP DXPOP CXPOP BXPOP AXRETCURMOVE ENDPSHOW PROC NEAR ;显示一个ASCLL字符子程序,AL为所显字符AL PUSH AXPUSH BXPUSH CXMOV AH,09HMOV BX,002fh ;BH/BL=字符背景色/字符颜色2fh=绿底白字MOV CX,1 ;显示个数1INT 10H ;int 10 子功能09 显示一个字符POP CXPOP BXPOP AXRETSHOW ENDPDISPCR PROC NEAR ;光标回车换行PUSH AXPUSH DXMOV AH,2HMOV DL,0AHINT 21HMOV AH,2HMOV DL,0DHINT 21HPOP DXPOP AXRETDISPCR ENDPcode endsend start第二题:8086微机系统设计,具体要求如下:1、8086工作在最小方式。