80x86汇编编程:实现十进制或十六进制向二进制的转换

用8086/8088汇编语言编程,实现十进制或十六进制向二进制的转换。
要求通过键盘输入数字,有H为16进制、无H为10进制,然后按照二进制输出。

例如:输入1、2、回车,那么第二行应该显示1100;
如果输入1、2、H、回车,那么第二行应该显示00010010。

不用考虑输入有错的情况
;================================================

满意回答:

可以用10号功能调用,输入字符串,判断最后一个字符是不是H,来确认是10进制,还是16进制。

不用考虑输入有错的情况,重点是区分10进制和16进制,这样,处理起来就很简单了。

程序如下:

;============================================

data  segment
    T1    DB  'Input  a  num : $'
    K_IN  DB  4     ;允许输入四个字符(含回车)
    NNN   DB  ?     ;实际输入的个数(不含回车)
    IN_B  DB  4 DUP(?);实际输入的字符(含回车)

    N2    DW  ?     ;存放待处理的字符个数
    N3    DB  10    ;先假定是10进制
    BIN   DB  0     ;二进制形式的数字
data  ends

code  segment
    assume  cs:code, DS: DATA
start:
    mov  ax, data
    mov  ds, ax
;--------------------------------------------
    MOV  AH, 9      ;显示:Input...
    LEA  DX, T1
    INT  21H
;--------------------------------------------
    MOV  AH, 10     ;等待键入字符串
    LEA  DX, K_IN
    INT  21H
    MOV  CL, NNN
    AND  CL, CL
    JZ   EXIT       ;如果输入零个字符,就退出
;--------------------------------------------
    MOV  DL, 10     ;回车换行
    MOV  AH, 2
    INT  21H
    MOV  DL, 13
    MOV  AH, 2
    INT  21H
;--------------------------------------------
    MOV  CH, 0
    MOV  N2, CX     ;这是输入字符的个数

    DEC  CX
    LEA  BX, IN_B   ;这是输入字符的起始位置
    ADD  BX, CX     ;这是输入字符的末尾位置

    MOV  DL, [BX]      ;取出最后一个字符
    AND  DL, 11011111B ;变成大写
    CMP  DL, 'H'       ; = H ?
    JNZ  DDDD          ;否,转到10进制
    MOV  N3, 16        ;是则按照16进制
    DEC  N2            ;有效字符个数减一
;--------------------------------------------
DDDD:
    LEA  BX, IN_B   ;从头开始取出
    MOV  CX, N2     ;待处理的字符个数
LOP:
    MOV  AL, BIN    ;老数据乘以进制
    MUL  N3          ;乘以进制
    MOV  BIN, AL

    MOV  AL, [BX]   ;取新数据的ASCII码
    SUB  AL, 30H    ;变成二进制数
    CMP  AL, 10
    JB   N_7
    SUB  AL, 7
N_7:
    ADD  BIN, AL    ;加入到老数据中
    INC  BX
    LOOP LOP        ;循环处理下一个
;--------------------------------------------
    CALL OUT_BIN    ;显示
EXIT:
    mov  ah, 4ch    ;程序结束
    int  21h
;--------------------------------------------
OUT_BIN:            ;显示子程序
    MOV  AL, BIN
    MOV  BL, 2
    MOV  CX, 0
L1:
    MOV  AH, 0
    DIV  BL
    PUSH AX
    INC  CX
    AND  AL, AL
    JNZ  L1
L2:
    POP  DX
    MOV  DL, DH
    ADD  DL, 48
    MOV  AH, 2
    INT  21H
    LOOP L2
    RET
;--------------------------------------------
code  ends
    end  start
;============================================

执行效果如下:

C:\MASM>H_B
Input  a  num : 12
1100
C:\MASM>H_B
Input  a  num : 12H
10010
C:\MASM>

;================================================
回答者: 做而论道 | 十六级   2012-4-10 21:24
提问者对回答的评价:非常感谢!!
原题网址:http://zhidao.baidu.com/question/407503928.html
;================================================

 

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值