汇编语言:从键盘输入两位十六进制数,转化成十进制输出

从键盘输入两位十六进制数,转化成十进制输出

示例:
输入:10
输出:16
输入:ed
输出:237
输入:egd
输出:237
当输入无效字符时,自动屏蔽

题目分解

首先我们可以将这个题目分解为三个小部分。

  1. 从键盘输入两个16进制数,思考两个十六进制数该如何写;
  2. 将十六进制数转化成十进制;
  3. 最后我们要考虑如何输出。

解决了这三个小问题,本题就算完成了。

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

运行结果
输入为10时
输入为ed时
输入为egd时,自动屏蔽无效字符g

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值