从键盘输入两位十六进制数,转化成十进制输出
示例:
输入:10
输出:16
输入:ed
输出:237
输入:egd
输出:237
当输入无效字符时,自动屏蔽
题目分解
首先我们可以将这个题目分解为三个小部分。
- 从键盘输入两个16进制数,思考两个十六进制数该如何写;
- 将十六进制数转化成十进制;
- 最后我们要考虑如何输出。
解决了这三个小问题,本题就算完成了。
1.我们使用1号功能从键盘输入的字符存放在AL里且是ASCII码,需要经过一系列减法才能转换成我们想要的十六进制数。分次输入,并且屏蔽无效字符。使用条件转移指令可有效解决这个问题。
2.十六进制转换成十进制可以采用循环取余的方式,这也是非常简单的一种方式。
3.输出可以考虑采用堆栈的方式,符合循环取余先求后输出的特点。
代码如下
CODE SEGMENT
ASSUME CS:CODE
START:
MOV CX,0
MOV BX,0
INPUT:
MOV AH,1
INT 21H
SUB AL,30H ;减去30H,判断是不是数字
CMP AL,10
JB DIG ;跳转到数字
SUB AL,27H ;减去27H,判断是不是a~f
CMP AL,16
JAE INPUT ;不是a~f,重新输入
DIG:
ADD BL,AL ;加bl里备用
ADD CX,1 ;cx加1,到2时输出
CMP CX,2
JE OUTPUT
ROL BL,1 ;bl左移四位
ROL BL,1
ROL BL,1
ROL BL,1
JMP INPUT
OUTPUT:
MOV AL,BL
MOV AH,0
MOV BL,10 ;为循环除法取余作准备
MOV CX,0
LDIV:
MOV AH,0
ADD CX,1
DIV BL ;al存放商,ah存放余数
PUSH AX;压栈
CMP AL,0 ;商为0时停止循环
JNE LDIV
MOV AH,2
MOV DL,10 ;换行符
INT 21H
NEXT:
POP AX
MOV DL,AH
ADD DL,30H
MOV AH,2
INT 21H
SUB CX,1
CMP CX,0
JNE NEXT
MOV AH,4CH
INT 21H
CODE ENDS
END START
运行结果