📄 03c.asm
字号:
DATA SEGMENT
ORG 1000H
H1 DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
H2 DB 1 DUP(?)
TIP DB 13,10,"The input number must be a HEX (0~F), press <ESC> to quit.",13,10,'$'
ERR DB 13,10,"The input number must be a HEX (0~F).",13,10,'$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START PROC FAR
STT:PUSH DS
SUB AX,AX
PUSH AX
;==============================
MOV AX,DATA
MOV DS,AX
LEA DX,TIP ;打印TIP信息
MOV AH,09H
INT 21H
BEGIN:
MOV DL,13 ;打印换行
MOV AH,2
INT 21H
MOV DL,10 ;打印回行首
INT 21H
MOV AH,1 ;等待从键盘输入
INT 21H
MOV SI,OFFSET H2 ;保护输入
MOV [SI],AL
CMP AL,27 ;如果按下<ESC>键,跳至QUIT
JZ QUIT
CALL DISPLAY0 ;调用DISPLAY0子程序
CALL ASCII2HEX ;调用ASCII2HEX子程序
CMP AL,0FFH ;如果AL不等于FF(出错码)则跳至CORRECT
JNZ CORRECT
LEA DX,ERR ;打印错误信息
MOV AH,09H
INT 21H
JMP FINISH ;跳至FINISH
CORRECT:
MOV BX,OFFSET H1 ;查表
XLAT
MOV AH,0
MOV BX,0
MOV BL,AL ;分离AL的高4位和低4位,分离后AL中为高4位,BL中为低4位
AND AL,0F0H
MOV CL,4
SHR AL,CL
AND BL,0FH
CALL HEX2ASCII ;调用HEX2ASCII
CALL DISPLAY ;调用DISPLAY子程序
MOV AL,BL
CALL HEX2ASCII
CALL DISPLAY
MOV DL,72 ;打印字母"H"
MOV AH,2
INT 21H
JMP FINISH
QUIT:CALL ESCAPE ;调用ESCAPE子程序
FINISH:
JMP BEGIN
;==============================
RET
START ENDP
ASCII2HEX PROC NEAR
CMP AL,30H ;ASCII转16进制子程序
JB ERROR ;如果AL<0则跳至ERROR
CMP AL,39H
JBE NUMBER ;如果AL<=9则跳至NUMBER
CMP AL,46H
JA ERROR ;如果AL>F则跳至ERROR
SUB AL,07H
NUMBER:
SUB AL,30H
JMP DONE
ERROR:
MOV AL,0FFH
DONE:
RET
ASCII2HEX ENDP
HEX2ASCII PROC NEAR
CLC ;16进制转ASCII子程序
DAA
ADD AL,0F0H
ADC AL,40H
RET
HEX2ASCII ENDP
DISPLAY PROC NEAR
PUSH DX ;显示结果子程序
MOV DL,AL
MOV AH,2
INT 21H
POP DX
RET
DISPLAY ENDP
DISPLAY0 PROC NEAR
PUSH AX ;该子程序打印输入及":"
PUSH DX
PUSHF
MOV DL,13
MOV AH,2
INT 21H
MOV DL,10
INT 21H
MOV DL,[SI] ;打印输入
INT 21H
MOV DL,58 ;打印":"
INT 21H
POPF
POP DX
POP AX
RET
DISPLAY0 ENDP
ESCAPE PROC NEAR
MOV AH,4CH ;返回操作系统子程序
INT 21H
RET
ESCAPE ENDP
CODE ENDS
END STT
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -