您的位置:首页 > 其它

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

2016-01-25 11:52 176 查看
;从键盘输入四位16进制数,以2进制输出
;=============================================
DATA SEGMENT
STR1    DB  'INPUT A HEX NUM: $'
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 ! $'
STR2    DB  13, 10, 'BINARY IS: $'
DATA    ENDS
;--------------------------------------------
STACK SEGMENT PARA STACK  'STACK'   
   DB 100 DUP(?)
STACK ENDS
;--------------------------------------------
CODE SEGMENT
    ASSUME  CS:CODE, SS:STACK, DS:DATA
START:
    MOV  AX, DATA
    MOV  DS, AX
    MOV  AX, STACK
    MOV  SS, AX
    LEA  DX, STR1   ;'INPUT A HEX NUM'
    MOV  AH, 9      ;显示字符串
    INT  21H
    LEA  DX, HEX
    MOV  AH, 10     ;等着输入四位HEX数
    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, 'F'
    JA   ERROR      ;大于'F'转移
    CMP  BL, '9'
    JNA  A2B        ;不大于'9', 就去变换
    CMP  BL, 'A'
    JNB  A2B        ;不小于'A', 就去变换
    JMP  ERROR      ;其它符号都是错误
;---------------------------------------
A2B:
    SUB  BL, 30H    ;ASC-->BIN
    CMP  BL, 10
    JB   A2B_END
    SUB  BL, 07H    ;ASC-->BIN
A2B_END:
;---------------------------------------
    MOV  BH, 0      ;弄成16位数
    PUSH CX
    MOV  AX, BIN    ;把原来的数字乘以16
    MOV  CX, 16
    MUL  CX
    ADD  AX, BX     ;加上新输入的
    MOV  BIN, AX    ;存结果,这就是二进制数
    INC  SI
    POP  CX
    DEC  CH         ;处理次数减一
    JNZ  CONV       ;非零转移
;---------------------------------------
DISP:
    LEA  DX, STR2   ;'BINARY IS:  $'
    MOV  AH, 9      ;显示字符串
    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
;=============================================
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: