8.從鍵盤輸入一系列字元(以回車符結束),並按字母、數字及其他字元分類計數,最後顯示這三類字元的計數結果
阿新 • • 發佈:2020-10-26
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