6.從鍵盤上接收一個4位十六進位制數,然後在顯示器上顯示其對應的16位二進位制數。
阿新 • • 發佈:2020-10-26
;從鍵盤上接收一個4位十六進位制數,然後在顯示器上顯示其對應的16位二進位制數。 ;該程式可以判斷判斷輸入資料是否合法,可以根據需要進行重新輸入或者退出 ;需要注意輸入字元後如果需要輸出需要提前儲存AL避免被改變 DATAS SEGMENT MSG1 DB 'INPUT YOUR NUMBER:','$' MSG2 DB 'RESULT:','$' MSG3 DB 'INCORRECT INPUT DATA',0DH,0AH,'$' MSG4 DB 'CLICK ESC TO STOP OR OTHER TO AGAIN',0DH,0AH,'$' DATAS ENDS OUTPUT MACRO ASC MOV DL,ASC MOV AH,02H INT 21H ENDM ;輸出單字元 CRLF MACRO OUTPUT 0DH OUTPUT 0AH ENDM ;輸出回車、換行 TIP MACRO ASC LEA DX,ASC MOV AH,09H INT 21H ENDM ;輸出字串提示 STACKS SEGMENT ;此處輸入堆疊段程式碼 STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS MAIN PROC FAR ;主程式 MOV AX,DATAS MOV DS,AX CALL INPUT CALL SHOW_RESULT CALL EXIT MAIN ENDP INPUT PROC ;輸入子程式 MOV BX, 0 ;用於存放四位的16進位制數 MOV CH, 4 ;輸入個數的計數器 MOV CL, 4 ;控制移位個數 TIP MSG1 ENTRY: SHL BX, CL ;將已經輸入的數左移4位 MOV AH, 01H ;接收鍵盤輸入 INT 21H CMP AL, 30H JB ERROR ;輸入數小於0,出錯退出 CMP AL, 39H JA AF ;不是,轉‘A~F’的處理 AND AL, 0FH ;把ASCII碼轉換為 JMP NEXT AF: AND AL, 11011111B ;為了便於比較輸入字元是否在符合範圍內需要統一 ;轉換為大寫字母 CMP AL, 41H ;判斷小於A嗎? JB ERROR ;不是‘A~F’的數重新輸入 CMP AL, 46H ;判斷大於F嗎? JA ERROR ;不是‘A~F’的數重新輸入 AND AL, 0FH ;轉換為:1010B~1111B ADD AL, 9 NEXT: OR BL, AL ;將鍵盤輸入的數加入BX中 DEC CH JNZ ENTRY ;判斷是否已經輸完四個數 RET ERROR: CALL ERROR INPUT ENDP SHOW_RESULT PROC CRLF TIP MSG2 ;輸出轉換結果提示資訊 MOV CL, 16 ;將16位二進位制數一位位地轉換成ASCII碼顯示 DISP: MOV AL,04H ;沒輸出四位便輸出一個空格 PUSH AX OUTPUT 0H ;輸出空格 POP AX DISP1: SHL BX,1 JNC ZERO JMP ONE NEXT: DEC CL CMP CL,0 JE RETURN DEC AL CMP AL,0 JE DISP JMP DISP1 ZERO: ;輸出0 PUSH AX OUTPUT 30H POP AX JMP NEXT ONE: ;輸出1 PUSH AX OUTPUT 31H POP AX JMP NEXT RETURN: RET SHOW_RESULT ENDP ERROR PROC ;輸入錯誤處理子程式 CRLF TIP MSG3 TIP MSG4 ;輸出提示資訊 MOV AH,07H INT 21H PUSH AX CRLF CRLF POP AX CMP AL,1BH JNZ BEGINS ;如果輸入ESC則結束程式,否則重新進行輸入 JMP STOP BEGINS: CALL MAIN STOP: CALL EXIT ERROR ENDP EXIT PROC ;程式退出 MOV AH,4CH INT 21H EXIT ENDP CODES ENDS END MAIN