1、$STRING2 DB 2. Find the maximum of string;STRING3 DB 3. Sort for datas;STRING4 DB 4. Show Time;STRING5 DB 5. Exit.STRINGN DB Input the number you select (1-5) : $IN_STR DB Input the string (including letters & numbers, less than 60 letters) :PRESTR DB Original string :NEWSTR DB New string :OUT_STR D
2、B The string is $MAXCHR DB The maximum is $IN_NUM DB Input the numbers (0 - 255, no more than 20 numbers) : OUT_NUM DB Sorted numbers :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
3、(?DATA ENDSCODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACKSTART: MOV AX, DATA MOV DS, AX MOV AX, STACK MOV SS, AX MOV SP, OFFSET TOPMAIN: CALL FAR PTR MENU ; 设置显示器AGAIN: MOV AH, 2 MOV BH, 0 ; 页号 MOV DL, 41 ; 列号 MOV DH, 10 ; 行号 INT 10H ; 光标位置设置 MOV AH, 1 INT 21H CMP AL, 1 JB AGAIN5 JA AGAIN SUB AL, ;
4、N-1 SHL AL, 1 ; (N-1)*2 CBW ; AL-AX LEA BX, TABLE ADD BX, AX JMP WORD PTR BXG1: CALL FAR PTR CHGLTR MOV AH, 8 CMP AL, 1BH JZ MAIN JMP G1G2: CALL FAR PTR MAXLTR JMP G2G3: CALL FAR PTR SORTNUM JMP G3G4: CALL FAR PTR TIMCHKJZ MAIN JMP G4G5: MOV AH, 4CHMENU PROC FAR ; 显示主界面 ;设置显示器方式 MOV AH, 0 MOV AL, 3;
5、 MOV BL, 0; 清屏 MOV DL, 5 ; MOV DH, 5 ; MOV AH, 9 LEA DX, STRING1 MOV DH, 6 ; LEA DX, STRING2 MOV DH, 7 ; LEA DX, STRING3 MOV DH, 8 ; LEA DX, STRING4 MOV DH, 9 ; LEA DX, STRING5 LEA DX, STRINGN RETMENU ENDPCHGLTR PROC FAR ; 将输入字符串中小写字母便换成大写字母RECHG: MOV AL, 3 MOV BL, 0 输入提示光标位置设置 LEA DX, IN_STR INT 21
6、H ; 输入字符串提示 输入字符串光标位置设置 MOV AH, 0AH LEA DX, KEYBUF 输入字符串 CMP KEYBUF + 1, 0 JZ RECHG ; 判断输入字符串是否为空串 LEA BX, KEYBUF + 2 MOV AL, KEYBUF + 1 CBW MOV CX, AX MOV BYTE PTR BX, ; 在输入字符串尾加结束标志$ 源字符串提示光标位置设置 LEA DX, PRESTR 输出源字符串提示 LEA DX, KEYBUF + 2 输出源字符串LCHG: CMP BYTE PTR BX, 61H JB NOCHG AND BYTE PTR BX,
7、0DFHNOCHG: INC BX LOOP LCHG ; 将字符串中小写字母转换成大写字母 新字符串提示光标位置设置 LEA DX, NEWSTR 输出新字符串提示 输出新字符串 提示信息光标位置设置 LEA DX, HINTSTR 输出提示信息CHGLTR ENDPMAXLTR PROC FAR ; 在输入字符串中找出最大值REMAX: JZ REMAX ; 在输入字符串位加结束标志$ LEA DX, OUT_STR 输出字符串提示 输出字符串 LEA DX, MAXCHR 输出字符串中最大值提示 MOV DL, 0LCMP: CMP BX, DL JB NOLCHG MOV DL, BX
8、NOLCHG: LOOP LCMP ; 找出字符串中最大字符,放入DL 输出字符串中最大字符MAXLTR ENDPSORTNUM PROC FAR ; 对输入数据组排序RESORT: LEA DX, IN_NUM 输入数据组光标位置设置 输入数据组字符串 CALL CIN_INT ; 字符串转换成数据串 CMP AL, 0 JZ RESORT ; 判断数据串是否有错 CMP NUMBUF, 0 判断数据串是否为空 输出提示光标位置设置 LEA DX, OUT_NUM 输出数据串提示 输出数据组光标位置设置 CALL FAR PTR MPSORT ; 数据组排序 CALL FAR PTR INT
9、_OUT ; 数据组的输出SORTNUM ENDPCIN_INT PROC NEAR ; 读入整型数; 入口参数:无 出口参数为:AL(有无错误标志,0为有,1为无) MOV CL, KEYBUF + 1 LEA SI, KEYBUF + 2 MOV CH, 0 ; 数据组数据个数置0 MOV DH, 10 MOV AL, 0 ; 当前数据x=0 MOV DL, 0 ; 有无数据标志置0,即无数据FNDNUM: CMP BYTE PTR SI, JZ ADDNUM ; 判断当前字符是否为空格0 JB ERRNUM9 JA ERRNUM ; 判断当前字符是否在-之间 MOV DL, 1 ; 有无
10、数据标志置1,即有数据 MUL DH XOR BH, BH MOV BL, SI ADD AX, BX SUB AX, 计算出当前数据x CMP AH, 0 判断x是否越界 JMP NEXTADDNUM: CMP DL, 1 JNZ NEXT ; 判断是否有数据 INC CH ; 数据组数据个数加1 CALL ADDNEW 清零NEXT: INC SI DEC CL CMP CL, 0 JNZ FNDNUM ; 依次检查各字符 JNZ TOTAL ; 判断是否有未加入的数据 INC CHTOTAL: MOV NUMBUF, CH ; 置数据组数据个数 MOV AL, 1 ; 输入数据无错误 J
11、MP CRTNUMERRNUM: 输入数据有错误CRTNUM: RET CIN_INT ENDPADDNEW PROC NEAR ; 增加新数CH(数据组数据个数)、AL(当前数据x) 出口参数: PUSH AX LEA BX, NUMBUF MOV AL, CH POP AX MOV BX, ALADDNEW ENDPMPSORT PROC FAR ; MOV AL, NUMBUF CMP AL, 1 JBE NOSORT ; 若只有一个元素,停止排序 LEA SI, NUMBUF ; SI指向数据组首地址 ADD SI, CX ; SI指向数据组末地址 DEC CX ; 外循环次数LP1:
12、 ; 外循环开始 PUSH CX PUSH SI 交换标志置0LP2: 内循环开始 MOV AL, SI CMP AL, SI - 1 JAE NOXCHG XCHG AL, SI - 1 ; 交换操作 MOV SI, AL 交换标志置1NOXCHG: DEC SI LOOP LP2 POP SI POP CX JNZ NOSORT ; 判断交换标志 LOOP LP1NOSORT:RETMPSORT ENDPINT_OUT PROC FAR ; 输出数据组 MOV BL, 10H LEA SI, NUMBUF + 1PRINT: CALL OUTNUM MOV DL, LOOP PRINTIN
13、T_OUT ENDPOUTNUM PROC NEAR ; 将十进制数以十六进制输出AL(待转换的数据),BL(转换进制数16) DIV BL CMP AH, 10 JB PNUM ADD AH, 7PNUM: ADD AH, 30H MOV DL, AH PUSH DX JZ OUTNOUTN: POP DXOUTNUM ENDPTIMCHK PROC FAR ; 设定并显示时间 设置提示光标位置设置 LEA DX, IN_TIM 时间串提示 输入时间串 MOV BL, 10 MOV AL, KEYBUF + 2 MUL BL ADD AL, KEYBUF + 3 JB INVALID CMP AL, 24 JAE INVALID ; 判断 时 有效性 MOV CH, AL MOV AL, KEYBUF + 5 ADD AL, KEYBUF + 6 CMP