📄 convert.asm
字号:
DATA SEGMENT
MSG_IN DB "Enter a decimal number:","$"
MSG_OUT DB 0DH,0AH,"The converted hexadecimal number is ","$"
MSG_END DB "H","$"
MSG_ERROR DB 0DH,0AH,"Input error!","$"
DECIN DB 6,?,6 DUP(?)
DATA ENDS
STACK SEGMENT STACK
DB 100 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET MSG_IN
CALL DISP ;显示输入提示
LEA DX,DECIN ;
CALL INPUT ;从键盘输入
LEA SI,DECIN+2 ;
CALL ASC_HEX ;调用ASC_HEX将输入的十进制转为十六进制
MOV BX,AX
MOV DX,OFFSET MSG_OUT ;
CALL DISP ;输出字符串
CALL PRINTHEX ;调用PRINTHEX输出BH的十六进制
MOV BH,BL
CALL PRINTHEX ;再次调用PRINTHEX输出BH的十六进制
MOV DX,OFFSET MSG_END
CALL DISP ;输出结尾处的H
JMP EXIT
ERROR:
MOV DX,OFFSET MSG_ERROR ;输入错误
CALL DISP
EXIT:
MOV AH,4CH
INT 21H
INPUT PROC ;输入字符串
MOV AH,0AH
INT 21H
RET
INPUT ENDP
DISP PROC ;显示字符串
MOV AH,9
INT 21H
RET
DISP ENDP
ASC_HEX PROC ;十进制ASCII转换为十六进制,存在AX中
XOR AX,AX ;将AX置0
XOR CX,CX ;将CX置0
BEGIN:
MOV CL,[SI] ;把字符串存的地址传给CL
CMP CL,'0' ;判断字符是否比”0”小
JB ERROR ;如果字符不是数字,则提示错误
CMP CL,'9' ;判断字符是否比”9”大
JA ERROR ;如果字符不是数字,则提示错误
MOV BL,30H
SUB CL,BL ;将CL中存放字符所对应的数字
MOV BX,000AH
MUL BX ;AX = AX * 10
ADD AX,CX ;AX = AX + CX ,将当前的字符加上
INC SI
MOV BX,[SI] ;输入下一个字符
CMP BL,0DH ;遇到回车符停止子程序
JE DONE
JMP BEGIN ;开始处理下一个字符
DONE: RET
ASC_HEX ENDP
PRINTHEX PROC ;将BH按十六进制显示出
MOV DL,BH ;把BH的值存到DL中
MOV CL,4
SHR DL,CL ;DL右移4位,先将BH高4位以十六进制显示出
ADD DL,30H ;”0”的ASCII码为30H
CMP DL,3AH ;如果大于9
JL PDL1
ADD DL,07H ;再加7 因为 “A”的ASCII码是41H
PDL1:
MOV AH,2
INT 21H ;显示出BH高4位的十六进制
MOV DL,BH
AND DL,0fH ;取BH的低四位
ADD DL,30H ;和高四位一样的处理方式,显示出低四位表示的十六进制
CMP DL,3AH
JL PDL2
ADD DL,07H
PDL2:
MOV AH,2
INT 21H
RET
PRINTHEX ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -