-/
微机上机作业三
内容:
编写如下程序,并在机器上调试成功。程序采用菜单式选择,可以接收用户从键盘输入的五个命令(1-5),各命令功能分别为:
(1) 按下“1”键,完成字符串小写字母变成大写字母。 (2) 按下“2”键,完成找最大值(二选一)。 (3) 按下“3”键,完成排序(二选一)。 (4) 按下“4”键,显示时间。
(5) 按下“5”键,结束程序运行,返回系统提示符。 汇编程序:
STACK TOP STACK DATA TABLE
SEGMENT STACK LABEL WORD ENDS SEGMENT
DW G1, G2, G3, G4, G5
DB 256 DUP(?)
STRING0 DB' Form the school ID is 02111460 Li Cheng',0DH,0AH,'$'
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 PRESTR
DB 'Input the string (including letters & numbers, less than 60 letters) :', 0DH, 0AH, '$'
DB 'Original string : $'
NEWSTR DB 'New string : $' OUT_STR DB 'The string is $' MAXCHR DB 'The maximum is $' IN_NUM OUT_NUM IN_TIM
DB 'Input the numbers (0 - 255, no more than 20 numbers) : ', 0DH, 0AH, '$' DB 'Sorted numbers : ', 0DH, 0AH, '$' 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 (?) DB 20 DUP (?) ENDS
NUMBUF DB ? DATA
-/
CODE START:
SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK MOV AX, DATA MOV DS, AX MOV AX, STACK MOV SS, AX MOV SP, OFFSET TOP
CALL FAR PTR MENU
; 设置显示器
MAIN: AGAIN: G1: G2: G3:
MOV AH, 2 MOV BH, 0 MOV DL, 41 MOV DH, 10 INT 10H MOV AH, 1 INT 21H CMP AL, '1' JB AGAIN CMP AL, '5' JA AGAIN SUB AL, '1' SHL AL, 1 CBW
LEA BX, TABLE ADD BX, AX JMP WORD PTR [BX] CALL FAR PTR CHGLTR MOV AH, 8 INT 21H CMP AL, 1BH JZ MAIN JMP G1
CALL FAR PTR MAXLTR MOV AH, 8 INT 21H CMP AL, 1BH JZ MAIN JMP G2
CALL FAR PTR SORTNUM MOV AH, 8
; N-1 ; (N-1)*2 ; AL->AX
; 页号 ; 列号 ; 行号
; 光标位置设置
INT 21H CMP AL, 1BH JZ MAIN JMP G3
G4: CALL FAR PTR TIMCHK MOV AH, 8 INT 21H CMP AL, 1BH JZ MAIN JMP G4 G5: MOV AH, 4CH INT 21H
MENU PROC FAR
MOV AH, 0 MOV AL, 3; MOV BL, 0; INT 10H
MOV AH, 2 MOV BH, 0 MOV DL, 5 MOV DH, 5 INT 10H
MOV AH, 9 LEA DX, STRING0 INT 21H MOV AH, 2 MOV DL, 5 MOV DH, 6 INT 10H
MOV AH, 9 LEA DX, STRING1
INT 21H MOV AH, 2 MOV DL, 5 MOV DH, 7 INT 10H
MOV AH, 9 LEA DX, STRING2 INT 21H
MOV AH, 2
-/
; 显示主界面
;设置显示器方式 ; 清屏
; 页号 ; 列号 ; 行号
; 光标位置设置
; 列号 ; 行号
; 光标位置设置
; 列号 ; 行号
; 光标位置设置
-/
MOV DL, 5 MOV DH, 8 ; 列号 ; 行号
INT 10H
MOV AH, 9
LEA DX, STRING3 INT 21H MOV AH, 2 MOV DL, 5 MOV DH, 9 INT 10H
MOV AH, 9 LEA DX, STRING4 INT 21H
MOV AH, 2 MOV DL, 5 MOV DH, 10 INT 10H
MOV AH, 9 LEA DX, STRING5 INT 21H MOV AH, 2 MOV DL, 5 MOV DH, 11 INT 10H
MOV AH, 9 LEA DX, STRINGN INT 21H
RET
MENU ENDP
CHGLTR
PROC FAR
RECHG: ;设置显示器方式 MOV AH, 0 MOV AL, 3 MOV BL, 0 INT 10H
MOV AH, 2 MOV BH, 0 MOV DL, 5 MOV DH, 5 INT 10H
MOV AH, 9 LEA DX, IN_STR
INT 21H
; 光标位置设置
; 列号 ; 行号
; 光标位置设置
; 列号 ; 行号
; 光标位置设置
; 列号 ; 行号
; 光标位置设置
; 将输入字符串中小写字母便换成大写字母
; 清屏
; 页号 ; 列号 ; 行号
; 输入提示光标位置设置
; 输入字符串提示
-/
MOV AH, 2 MOV DL, 5 MOV DH, 6 INT 10H MOV AH, 0AH LEA DX, KEYBUF INT 21H JZ RECHG
; 输入字符串
; 判断输入字符串是否为空串
CMP KEYBUF + 1, 0 LEA BX, KEYBUF + 2 MOV AL, KEYBUF + 1 CBW MOV CX, AX ADD BX, AX
MOV BYTE PTR [BX], '$' ; 在输入字符串尾加结束标志$ MOV AH, 2 MOV BH, 0 MOV DL, 5 MOV DH, 7 INT 10H MOV AH, 9 LEA DX, PRESTR INT 21H MOV AH, 9 LEA DX, KEYBUF + 2 INT 21H
; 输出源字符串
LEA BX, KEYBUF + 2 CMP BYTE PTR [BX], 61H JB NOCHG
AND BYTE PTR [BX], 0DFH INC BX LOOP LCHG MOV AH, 2 MOV BH, 0 MOV DL, 5 MOV DH, 8 INT 10H MOV AH, 9 LEA DX, NEWSTR
; 输出新字符串提示
MOV AH, 9 LEA DX, KEYBUF + 2
; 页号 ; 列号 ; 行号
; 新字符串提示光标位置设置
; 将字符串中小写字母转换成大写字母
; 输出源字符串提示
; 页号 ; 列号 ; 行号
; 源字符串提示光标位置设置
; 列号 ; 行号
; 输入字符串光标位置设置
LCHG:
NOCHG:
INT 21H