键盘输入一个两位数的16进制,将其转换为10进制并显示
主要思路:首先将16进制转为10进制数字存储在BX中,再将BX用字符存储在TEMP中,显示TEMP即可。
16进制转为10进制数字存储例子:
1.f ->15 将f字符变为数字15
2.255=15*16+15
10进制数字转换为字符存储:
用循环除10取余,将余数加30H变为字符
(原本想写一个四位数的16进制转为10进制的代码,但是在转为10进制数字存储时出现错误,也不知道怎么改,就写了这一个)
代码的运行结果:ff是输入的16进制,255是转换成10进制(输入的16进制要小于ffh)
STACK SEGMENT PARA STACK
S_AREA DW 100H DUP(?)
STACK ENDS
DATA SEGMENT PARA
PROMPT DB 'Please enter a hexadecimal number:',0DH,0AH,'$'
PROMPT1 DB 'Input error!Please enter a hexadecimal number again:',0DH,0AH,'$'
TEMP DB 3 DUP(?),'$'
DATA ENDS
CODE SEGMENT PARA
ASSUME CS:CODE,DS:DATA,SS:STACK
MAIN PROC FAR
MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
CALL HEXTODEC
EXIT: MOV AX,4C00H
INT 21H
MAIN ENDP
HEXTODEC PROC
LEA DX,PROMPT
MOV AH,09H
INT 21H
INTP:
MOV BX,0 ;用于存放两位的16进制数
MOV CL,2
INPUT:
MOV AH,1 ;从键盘取数
INT 21H
CMP AL,30H ;9?
JA AF
SUB AL,30H ;字符1-9变为数字1-9
JMP TONUM
AF:
AND AL,11011111B ;转换为大写字母
CMP AL,41H ;F吗?
JA FAULT
SUB AL,37H ;字符A-F变为数字10-15
TONUM:
CMP CL,2
JB TWO
MOV DH,16
MUL DH
JMP ADDITION
TWO:
MOV DH,1
MUL DH
ADDITION:
ADD BX,AX
DEC CL
JNZ INPUT
JMP TODEC
FAULT:
LEA DX,PROMPT1
MOV AH,09H
INT 21H
JMP INTP
TODEC:
MOV CX,3
MOV AX,BX
MOV BX,10
LEA DI,TEMP+2
CHANGE: MOV DX,0
DIV BX ;AX/BX 相除之后:AX = 整数 ,DX = 余数
OR DL,30H ;将数字转换成字符
MOV BYTE PTR [DI],DL ;BYTE PTR 表示[DI]处一个字节
DEC DI
LOOP CHANGE
MOV BYTE PTR [DI],3
LEA DX,TEMP
MOV AH,9
INT 21H
RET
HEXTODEC ENDP
CODE ENDS
END MAIN
如有错误,欢迎指正!
做个废材继续可爱 原创文章 4获赞 4访问量 127 关注 私信 展开阅读全文