从键盘输入不多于四位的十进制数,以十六位二进制数形式输出

编写一个8086程序,要求从键盘中输入不多于四位的ASCII十进制数,以回车结束,转换成十六位二进制数,然后输出。
悬赏分:150 | 解决时间:2011-10-13 08:16 |
=============================================
最佳答案:

题目要求的是输入四位十进制数(ASCII形式),假设是'1'、'3'、'5'、'7'。
那么就应该先变换成数字1、3、5、7,再计算出来:1 * 1000 + 3 * 100 + 5 * 10 + 7,把计算的结果存入到存储器,就是16位的二进制形式。

最后按照要求,以十六位二进制数形式输出。

程序如下:
;--------------------------------------------
DATA    SEGMENT
PROMPT  DB  'INPUT  HEXADECIMAL: $'
HEX     DB  5                       ;计划输入的字符个数(含回车符)
NNN     DB  0                       ;存放实际输入的字符个数
        DB  5  DUP(?)
BIN     DW  ?                       ;输入数字的二进制形式的存放单元
ERR     DB  0AH, 0DH, ' ERROR !'
        DB  0AH, 0DH, ' I  HAVE  NO  TIME  TO  PLAY  WITH  YOU ! $'
DATA    ENDS
;--------------------------------------------
STACK1  SEGMENT  PARA  STACK
    DW  20H  DUP(0)
STACK1  ENDS
;--------------------------------------------
CODE    SEGMENT
    ASSUME  CS:CODE, DS:DATA, ES:DATA, SS:STACK1
START:
    MOV  AX, DATA
    MOV  DS, AX
    MOV  AX, STACK1 
    MOV  SS, AX

    LEA  DX, PROMPT ;'INPUT  HEXADECIMAL: $'
    MOV  AH, 09H    ;9号功能调用,显示字符串
    INT  21H

    LEA  DX, HEX    ;实际输入的码存放到HEX后面的2个字节
    MOV  AH, 0AH    ;10号功能调用,输入ASCII字符串
    INT  21H
;---------------------------------------
    MOV  BIN, 0

    LEA  SI, HEX + 2;取输入字符串的首地址
    MOV  CH, NNN    ;取输入字符的个数,用来控制循环处理的次数

CONV:               ;代码转换
    MOV  BL, [SI]
    CMP  BL, 0DH
    JZ   END0       ;回车即结束
    CMP  BL, '0'
    JB   ERROR      ;小于'0'转移
    CMP  BL, '9'
    JA   ERROR      ;大于'9'转移

BIN1:               ;是'0' ~ '9'之间的
    AND  BL, 0FH    ;就转换二进制数
    MOV  BH, 0      ;再弄成16位数

    PUSH CX

    MOV  AX, BIN    ;把原来的数字乘以10
    MOV  CX, 10
    MUL  CX
    ADD  AX, BX     ;加上新输入的
    MOV  BIN, AX    ;存结果,这就是二进制数

    INC  SI         ;指向下一个输入的字符

    POP  CX
    DEC  CH         ;处理次数减一
    JNZ  CONV       ;非零转移
;---------------------------------------
DISP:
    MOV  DL, 13     ;先显示回车
    MOV  AH, 2
    INT  21H
    MOV  DL, 10     ;以及换行
    MOV  AH, 2
    INT  21H
;---------------------------------------
    MOV  AX, BIN    ;取来二进制数字
    MOV  CX, 16     ;显示16位数
DDDD:
    MOV  DL, '0'    ;先计划显示0
    TEST AX, 8000H  ;测试最高位
    JZ   DDD1
    INC  DL         ;非0就显示1
DDD1:
    PUSH AX
    MOV  AH, 2      ;显示DL中的ASCII码
    INT  21H
    POP  AX

    SHL  AX, 1      ;左移
    LOOP DDDD       ;CX-1,非零转移

    JMP  END0       ;16位显示完毕,转到结束
;---------------------------------------
ERROR:
    LEA  DX, ERR
    MOV  AH, 09H    ;错误信息提示
    INT  21H
;---------------------------------------
END0:
    MOV  AH, 4CH    ;返回DOS
    INT  21H
CODE     ENDS
;---------------------------------------
    END   START
;---------------------------------------

回答时间:2011-10-9 11:17 |
回答者: 做而论道 | 十五级  采纳率:42% 名人 达人
原题网址:http://zhidao.baidu.com/question/327582058.html?fr=im100008

后记:
本题目的要求是输入十进制数字,这个也可以改为要求输入16进制的数字,这时的编程方法,可见下一篇文章。
=============================================

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值