输入十进制数,显示其二进制形式中 1 的个数
2016-01-25 11:57
295 查看
;要求:从键盘输入一个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
提问者对回答的评价:谢谢啊
;===============================
;程序如下:
;================================
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
提问者对回答的评价:谢谢啊
;===============================
相关文章推荐
- PHP+apc+ajax实现的ajax_upload上传进度条代码
- DS18B20 与数字温度计
- “在场人数”的统计
- ZOJ 1016 Parencodings *^*
- 字符串着色
- 搞懂Path环境变量
- sublime 快捷键
- Leetcode 316. Remove Duplicate Letters
- 单片机流水灯闪烁问题
- 【Leetcode】67. Add Binary
- 8086汇编语言编程--大小写转换、统计个数、显示时还要求发音
- 字典和集合的常用用法
- C语言编程:统计输入的各字符的个数
- 用 LCD1602 显示的时钟
- 溢出的概念和判断方法
- C语言编程:扑克牌魔术
- 80x86汇编编程:键入两个8进制数字,相加后以16进制输出
- Python -- collection 系列
- 80x86汇编编程:在输入的字符串中查找关键字
- 80x86汇编编程:实现十进制或十六进制向二进制的转换