STACK SEGMENT 'STACK'
DW 4096 DUP('C')
TOP LABEL WORD
STACK ENDS
DATA SEGMENT
TRANSFORM DB '1.TRANSFORM', 0DH,0AH,'$'
MAX DB '2.MAX',0DH,0AH,'$'
SORT DB '3.SORT',0DH,0AH,'$'
TIME DB '4.TIME',0DH,0AH,'$'
EXIT DB '5.EXIT',0DH,0AH,'$'
WAITING DB 'PLEASE INPUT NUM 1-5 TO SELECT SERVICE:',0DH,0AH,'$'
TIP DB 'PLEASE INPUT A STRING',0DH,0AH,'$'
TIPNUM DB 'PLEASE INPUT A GROUP OF DECIMAL',0DH,0AH,'$'
ANYKEY DB 'PRESS ANY KEY TO CONTINUE',0DH,0AH,'$'
MAXIMUM DB 'THE MAXIMUM IS:$ '
INPUT_TIME DB 'PLEASE INPUT CURRENT TIME LIKE HH:MM:SS',0DH,0AH,'$'
QUESTION DB 'DO YOU WANT TO SET TIME(Y/N)',0DH,0AH,'$'
INPUT_ERROR DB'ERROR OR INVALID INPUT',0DH,0AH,'$'
SUCCESS DB 'SET TIME SUCCEED',0DH,0AH,'$'
STRING DW TRANSFORM,MAX,SORT,TIME,EXIT,WAITING
SERVICE DW TRANS,FIND_MAX,SORTING,SET_TIME,EXIT_TOSYS
BUFFER1 DB 512 DUP('C') ;INPUT BUFFER
BUFFER2 DB 512 DUP('C') ;PROCESS WORKSPACE
BUFFER3 DB 512 DUP('C') ;OUTPUT BUFFER
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
MOV ES,AX
LEA AX,TOP
MOV SP,AX
CALL SCREEN_INIT
MAIN_AGAIN:
CALL CLEAR_SCREEN
CALL DISPLAY_MENU
CALL GET_CHAR
CALL ORDER_PARSE
JMP MAIN_AGAIN
MOV AH,4CH
INT 21H
ORDER_PARSE PROC NEAR ;RETURN AL=-1 IF ERROR ELSE INVOKE SERVICE
PUSH AX
PUSH BX
AND AL,0FH
CMP AL,1
JB ERROR_OVER
CMP AL,5
JA ERROR_OVER
LEA BX,SERVICE
DEC AL
SHL AL ,1
XOR AH,AH
ADD BX,AX
CALL CLEAR_SCREEN
CALL word ptr [BX]
POP BX
POP AX
JMP OVER_ORDER
ERROR_OVER :
MOV AL,0FFH
OVER_ORDER:
RET
ORDER_PARSE ENDP
DISPLAY_MENU PROC NEAR ;display menu including five items
PUSH DX
PUSH CX
PUSH SI
MOV DH,0BH
MOV DL,14H
MOV CX,06H
LEA SI,STRING
NEXT_DIS:
MOV BH,0
CALL CURSOR_SET
PUSH DX
MOV DX,[SI]
ADD SI,02H
CALL STRING_DISPLAY
POP DX
INC DH
LOOP NEXT_DIS
POP SI
POP CX
POP DX
RET
DISPLAY_MENU ENDP
SCREEN_INIT PROC NEAR ;set screen mode 80*25 character
PUSH AX
MOV AH,0
MOV AL,02H
INT 10H
POP AX
RET
SCREEN_INIT ENDP
CURSOR_SET PROC NEAR ;set cursor BH PAGE,DH ROW,DL COLUMN
PUSH AX
MOV AH,02H
INT 10H
POP AX
RET
CURSOR_SET ENDP
STRING_DISPLAY PROC NEAR ;display string DX ADDRESS
PUSH AX
MOV AH,09H
INT 21H
POP AX
RET
STRING_DISPLAY ENDP
CLEAR_SCREEN PROC NEAR ;clear screen
PUSH AX
MOV AX,3
INT 10H
POP AX
RET
CLEAR_SCREEN ENDP
GET_CHAR_DIR PROC
PUSH DX
MOV AH,06H
MOV DL,0FFH
INT 21H
POP DX
RET
GET_CHAR_DIR ENDP
GET_CHAR_N PROC NEAR;AL<=INPUT CHAR,NO DISPLAY
MOV AH,07H
INT 21H
RET
GET_CHAR_N ENDP
GET_CHAR PROC NEAR ;AL<=IMPUT CHAR
PUSH DX
MOV AH,01H
INT 21H
PUSH AX
MOV DL,0DH
MOV AH,02H
INT 21H
MOV DL,0AH
INT 21H
POP AX
POP DX
RET
GET_CHAR ENDP
GET_STRING PROC NEAR ;DS:DX<=STRING
PUSH AX
PUSH DX
PUSH BX
PUSH SI
LEA DX,BUFFER1
MOV BUFFER1,0FFH
MOV AH,0AH
INT 21H
MOV BL,BUFFER1+1
XOR BH,BH
LEA SI,BUFFER1[BX+2]
CALL STR_END
POP SI
POP BX
POP DX
POP AX
RET
GET_STRING ENDP
TRANS PROC ;
PUSH AX
PUSH DX
PUSH CX
PUSH SI
PUSH DI
LEA DX,TIP
CALL STRING_DISPLAY
AGAIN_TRANS:
CALL GET_STRING
LEA SI,BUFFER1+2
LEA DI,BUFFER2
MOV CL,BUFFER1+1
XOR CH,CH
JCXZ OVER_TRANS
NEXT_TRANS:
MOV AL, BYTE PTR [SI]
CMP AL,'a'
JB NOPROCESS
CMP AL,'z'
JA NOPROCESS
AND AL,0DFH
NOPROCESS:
MOV BYTE PTR [DI],AL
INC SI
INC DI
LOOP NEXT_TRANS
OVER_TRANS:
MOV SI,DI
CALL STR_END
LEA DX,BUFFER1+2
CALL STRING_DISPLAY
LEA DX,BUFFER2
CALL STRING_DISPLAY
LEA DX,ANYKEY
CALL STRING_DISPLAY
CALL GET_CHAR_N
CMP AL,1BH
JZ EXIT_TRANS
JMP AGAIN_TRANS
EXIT_TRANS:
POP DI
POP SI
POP CX
POP DX
POP AX
RET
TRANS ENDP
STR_END PROC ;INSERT END FLAG SI=ADDRESS
PUSH SI
MOV BYTE PTR [SI],0DH
INC SI
MOV BYTE PTR [SI],0AH
INC SI
MOV BYTE PTR [SI],'$'
POP SI
RET
STR_END ENDP
FIND_MAX PROC;FIND MAXIMUM AMOUNT A STRING
PUSH AX
PUSH DX
PUSH CX
PUSH SI
LEA DX,TIP
CALL STRING_DISPLAY
MAX_AGAIN:
CALL GET_STRING
LEA SI,BUFFER1+2
MOV CL,BUFFER1+1
XOR CH,CH
MOV AL,[SI]
JCXZ FIND_MAX_OVER
FIND_MAX_NEXT:
INC SI
CMP AL,[SI]
JA MAX_NOPROCESS
MOV AL,[SI]
MAX_NOPROCESS:
LOOP FIND_MAX_NEXT
FIND_MAX_OVER:
LEA DX,BUFFER1+2
CALL STRING_DISPLAY
LEA DX,MAXIMUM
CALL STRING_DISPLAY
MOV DL,AL
CALL CHAR_DISPLAY
MOV DL,0DH
CALL CHAR_DISPLAY
MOV DL,0AH
CALL CHAR_DISPLAY
LEA DX,ANYKEY
CALL STRING_DISPLAY
CALL GET_CHAR_N
CMP AL,1BH
JNZ MAX_AGAIN
POP SI
POP CX
POP DX
POP AX
RET
FIND_MAX ENDP
CHAR_DISPLAY PROC;DISPLAY A CHARACTER DL
PUSH AX
MOV AH,02H
INT 21H
POP AX
RET
CHAR_DISPLAY ENDP
DEC2HEX PROC ;10 TO 16 BUFFER1->BUFFER2,CNT->BUF2,NUM->BUF2+1
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
LEA SI,BUFFER1+2
LEA DI,BUFFER2+1
XOR CH,CH
MOV CL,BUFFER1+1
MOV AL,0
MOV BL,0AH
MOV BYTE PTR BUFFER2,0
JCXZ DH_OVER
DEC_NEXT:
MOV BH,BYTE PTR [SI]
CMP BH,' '
JZ NEXT_NUM
CMP BH,'0'
JB ERROR_OVERFLOW
CMP BH,'9'
JA ERROR_OVERFLOW
CMP BH,':'
JZ NEXT_NUM
AND BH,0FH
MUL BL
JC ERROR_OVERFLOW
ADD AL,BH
JC ERROR_OVERFLOW
JMP NEXT_PRO
NEXT_NUM:
MOV [DI],AL
INC DI
INC BYTE PTR BUFFER2
XOR AX,AX
NEXT_PRO:
INC SI
LOOP DEC_NEXT
MOV [DI],AL
INC BYTE PTR BUFFER2
JMP DH_OVER
ERROR_OVERFLOW:
MOV BUFFER2,0
DH_OVER:
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
RET
DEC2HEX ENDP
HEX2DEC PROC ;INPUT:BUFFER2,NUM,BUFFER2+1,START;
; OUTPUT:BUFFER3,STRING,STACK :OR ,3OR2
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
MOV BP,SP
ADD BP,0EH
LEA DI,BUFFER3
LEA SI,BUFFER2+1
MOV CL,BUFFER2
XOR CH,CH
MOV BL,0AH
JCXZ HEX_OVER
HEX2DEC_OUTTER:
MOV AH,0
MOV AL,[SI]
PUSH CX
PUSH DI
MOV DL,[BP+1]
XOR DH,DH
ADD DI,DX
DEC DI
MOV CL,[BP+1]
HEX2DEC_INNER:
DIV BL
OR AH,30H
MOV BYTE PTR [DI],AH
DEC DI
XOR AH,AH
LOOP HEX2DEC_INNER
INC SI
POP DI
POP CX
ADD DI,DX
MOV AH,[BP]
MOV BYTE PTR [DI],AH
INC DI
LOOP HEX2DEC_OUTTER
HEX_OVER:
MOV SI,DI
CALL STR_END
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
RET 2
HEX2DEC ENDP
STR_NUM_ADJUST PROC;INPUT:BUFFER3, REMOVE INVALID ZERO
PUSH AX
PUSH BX
PUSH SI
PUSH DI
LEA SI,BUFFER3
LEA DI,BUFFER3
XOR AL,AL
L1:
MOV BL,[SI]
CMP BL,0DH
JZ ADJUST_OVER
CMP BL,' '
JZ CHAR_NEXT
CMP BL,'0'
JZ CHECK_FLAG
MOV AL,01H
JMP TRANSFER
CHECK_FLAG:
CMP AL,0
JZ ADJUST_NEXT
TRANSFER:
MOV [DI],BL
INC DI
JMP ADJUST_NEXT
CHAR_NEXT:
MOV BYTE PTR [DI],' '
INC DI
XOR AL,AL
ADJUST_NEXT:
INC SI
JMP L1
ADJUST_OVER:
MOV SI,DI
CALL STR_END
POP DI
POP SI
POP BX
POP AX
RET
STR_NUM_ADJUST ENDP
SORTING PROC ;SORT
PUSH AX
PUSH CX
PUSH DX
PUSH DI
SORT_AGAIN:
LEA DX,TIPNUM
CALL STRING_DISPLAY
CALL GET_STRING
CALL DEC2HEX
XOR CH,CH
MOV CL,BUFFER2
JCXZ SORT_ERROR
DEC CX
JCXZ SORT_COMPLETE
SORT_OUTTER:
LEA DI,BUFFER2+1
PUSH CX
SORT_INNER:
MOV AL,[DI]
CMP AL,[DI+1]
JBE SORT_NOPROCESS
XCHG AL,[DI+1]
MOV [DI],AL
SORT_NOPROCESS:
INC DI
LOOP SORT_INNER
POP CX
LOOP SORT_OUTTER
SORT_COMPLETE:
MOV AH,03H
MOV AL,' '
PUSH AX
CALL HEX2DEC
CALL STR_NUM_ADJUST
LEA DX,BUFFER1+2
CALL STRING_DISPLAY
LEA DX,BUFFER3
CALL STRING_DISPLAY
SORT_TIP:
LEA DX,ANYKEY
CALL STRING_DISPLAY
CALL GET_CHAR_N
CMP AL,1BH
JNZ SORT_AGAIN
JZ SORT_OVER
SORT_ERROR:
LEA DX,INPUT_ERROR
CALL STRING_DISPLAY
JMP SORT_TIP
SORT_OVER:
POP DI
POP DX
POP CX
POP AX
RET
SORTING ENDP
SET_TIME PROC;TIME SET SERVICE
PUSH AX
PUSH CX
PUSH DX
SETTIME_AGAIN:
CALL CLEAR_SCREEN
LEA DX,QUESTION
CALL STRING_DISPLAY
REFRESH:
MOV AH,2CH
INT 21H
MOV BUFFER2,3
MOV BUFFER2+1,CH
MOV BUFFER2+2,CL
MOV BUFFER2+3,DH
MOV AH,02H
MOV AL,':'
PUSH AX
CALL HEX2DEC
MOV AH,02H
MOV BH,0
MOV DH,0
MOV DL,60
INT 10H
MOV BUFFER3+8,' '
LEA DX,BUFFER3
CALL STRING_DISPLAY
CALL GET_CHAR_DIR
JZ REFRESH
CMP AL,'Y'
JNZ NOSET
LEA DX,INPUT_TIME
CALL STRING_DISPLAY
CALL GET_STRING
CALL DEC2HEX
MOV AH,2DH
MOV CH,BUFFER2+1
MOV CL,BUFFER2+2
MOV DH,BUFFER2+3
MOV DL,0
INT 21H
CMP AL,0H
JZ SET_TIME_SUCC
LEA DX,INPUT_ERROR
CALL STRING_DISPLAY
JMP NOSET
SET_TIME_SUCC:
LEA DX,SUCCESS
CALL STRING_DISPLAY
NOSET:
LEA DX,ANYKEY
CALL STRING_DISPLAY
CALL GET_CHAR_N
CMP AL,1BH
JNZ SETTIME_AGAIN
POP DX
POP CX
POP AX
RET
SET_TIME ENDP
EXIT_TOSYS PROC
MOV AH,4CH
INT 21H
RET
EXIT_TOSYS ENDP
CODE ENDS
END START
8086汇编练习
最新推荐文章于 2022-01-16 20:36:20 发布