1. 程式人生 > 實用技巧 >8.從鍵盤輸入一系列字元(以回車符結束),並按字母、數字及其他字元分類計數,最後顯示這三類字元的計數結果

8.從鍵盤輸入一系列字元(以回車符結束),並按字母、數字及其他字元分類計數,最後顯示這三類字元的計數結果

DATAS SEGMENT
MSG1 DB 'Please enter a string of characters:','$'
MSG2 DB 'Number of numbers:','$'
MSG3 DB 'Number of letters:','$'
MSG4 DB 'Number of others:','$'
BUF	DB 0FFH			;最多輸入254個
	DB ?			;實際輸入個數
	DB 0FFH DUP(?) 	;輸入緩衝區
RESULT DB	3 DUP(0)
DATAS ENDS

C_OUTPUT MACRO ASC		;定義單字元輸出巨集
	MOV DL,ASC
	MOV AH,02H
	INT 21H
	ENDM
S_OUTPUT MACRO ASC		;定義句子輸出巨集
	LEA DX,ASC
	MOV AH,09H
	INT 21H
	ENDM
CRLF MACRO 				;定義回車、換行輸出巨集
	C_OUTPUT 0AH
	C_OUTPUT 0DH
	ENDM
STACKS SEGMENT
    ;此處輸入堆疊段程式碼
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
MAIN PROC FAR			;主程式
	START:
	    MOV AX,DATAS
	    MOV DS,AX
	    
	    CALL INPUT
	    CALL COUNT
	    CALL SHOW_RESULT
	    
	    MOV AH,4CH
	    INT 21H
MAIN ENDP

INPUT PROC 				;字串輸入子程式
		S_OUTPUT MSG1
		LEA DX,BUF
		MOV AH,0AH
		INT 21H
		CRLF
		RET
INPUT ENDP

COUNT PROC 				;字元分類統計
		LEA SI,BUF+2
		CLD
	BEGIN:
		LODSB
		CMP AL,30H
		JB OTHER
		CMP AL,3AH
		JB NUMBER
		CMP	AL,41H
		JB OTHER
		CMP AL,5BH
		JB	CHAR
		CMP AL,61H
		JB OTHER
		CMP AL,7BH
		JB CHAR
		JMP OTHER
		
	OTHER:
		INC RESULT+1
		JMP CONTINUE
	CHAR:
		INC RESULT+2
		JMP CONTINUE
	NUMBER:
		INC RESULT+3
		JMP CONTINUE
		
	CONTINUE:
		DEC BUF+1
		JNZ BEGIN
		RET
COUNT ENDP

SHOW_RESULT PROC		;分類結果展示
		MOV SI,1
		S_OUTPUT MSG4
		CALL BINIDEC
		CRLF
		MOV SI,2
		S_OUTPUT MSG3
		CALL BINIDEC
		CRLF
		MOV SI,3
		S_OUTPUT MSG2
		CALL BINIDEC
		CRLF
		RET
SHOW_RESULT ENDP

BINIDEC	PROC			;二進位制轉換為10進位制並輸出
		LEA BX,RESULT
	    MOV AL,[BX][SI]		;取出儲存的計數結果
	    AND AX,00FFH
	    CMP AL,64H			;判斷結果是否大於100
	    JA THREE
	    CMP AL,0AH			;判斷結果是否大於10
	    JA TWO
	    JMP ONE
	THREE:					;結果除以100得到百位數
		MOV DL,64H
		DIV DL
		PUSH AX
		ADD AL,30H
		C_OUTPUT AL
		POP AX
		MOV AL,AH
		AND AX,00FFH
		JMP TWO
	TWO:					;得到十位數
		MOV DL,0AH
		DIV DL
		PUSH AX
		ADD AL,30H
		C_OUTPUT AL
		POP AX
		MOV AL,AH
		AND AX,00FFH
		JMP ONE
	ONE:					;得到個位數
		ADD AL,30H
		C_OUTPUT AL

		RET	
BINIDEC ENDP
CODES ENDS
    END MAIN