输入十进制数,显示其二进制形式中 1 的个数

来源:互联网 发布:svg3dtagcloud.js 编辑:程序博客网 时间:2024/06/05 19:46

;要求:从键盘输入一个10进制数(不超过2000),然后输出其二进制数中 1 的个数。

;程序如下:
;================================
DISP_STR  MACRO  X     ;宏定义.
    MOV  DX, OFFSET X
    MOV  AH, 9
    INT  21H
ENDM
;--------------------------------
DATA  SEGMENT          ;数据段.
  MSG1 DB  13, 10, 'Please Input : $'
  MSG3 DB  13, 10, 'The n(1)  is : $'
    x  DW  ?           ;存放新输入数据.
DATA  ENDS
;--------------------------------I
CODE   SEGMENT         ;代码段.
    ASSUME   CS: CODE, DS: DATA
START:
    MOV  AX, DATA
    MOV  DS, AX
;--------------------------------
IN_LOOP:
    DISP_STR  MSG1     ;宏调用,提示 Please Input :
;--------------------------------
    MOV  x,  0         ;数据清零.
_INX:
    MOV  AH, 1         ;输入字符.
    INT  21H
;--------------------------------
    CMP  AL, 13        ;回车?
    JE   _IN_END       ;是则结束输入.

    CMP  AL, '0'
    JB   IN_LOOP       ;小于'0',不是数字.
    CMP  AL, '9'
    JA   IN_LOOP       ;大于'9',不是数字.

    SUB  AL, '0'       ;变成数字
    MOV  CL, AL
    MOV  CH, 0         ;CX 就是新输入的数字.

    MOV  AX, x
    MOV  BX, 10        ;老数据乘以10
    MUL  BX
    ADD  AX, CX        ;加上新数据.
    MOV  x,  AX        ;保存.

    CMP  AX, 2000      ;与2000比较
    JA   IN_LOOP       ;大于,就重新输入
    JMP  _INX          ;不大,就继续输入下一位数
;--------------------------------
_IN_END:
    DISP_STR  MSG3     ;宏调用,提示  The n(1)  is :
    MOV  AX, 0
    MOV  BX, x
    MOV  CX, 16        ;判断16位数.
DDDD:
    CMP  BX, 8000H
    JB   EEEE
    INC  AX            ;个数加一.
EEEE:
    SHL  BX, 1         ;左移.
    LOOP DDDD          ;CX-1,非零转移.
;--------------------------------
DISP:                  ;以十进制显示AX内容
    MOV  BX,  10
    MOV  CX,  0
D_1:MOV  DX,  0
    DIV  BX
    ADD  DL,  '0'
    PUSH DX
    INC  CX
    CMP  AX,  0
    JNE  D_1
    MOV  AH,  2
D_2:POP  DX
    INT  21H
    LOOP D_2
;--------------------------------
    MOV  AH, 4CH      ;到此结束
    INT  21H
;--------------------------------
CODE  ENDS
    END  START
;================================

程序经过编译、连接后,执行效果如下:

C:\MASM>_1_N

Please Input : 1998
The n(1)  is : 8

C:\MASM>_1_N

Please Input : 536
The n(1)  is : 3

利用计算器,把 1998、536,变成二进制数,可以看到,它们其中确实是有 8 个和 3 个 1。
大家再试试别的数字,看看做而论道编写的程序是否正确。
;===============================
原题网址:http://zhidao.baidu.com/question/428152175.html
提问者对回答的评价:谢谢啊
;===============================

0 0
原创粉丝点击