一个简单的编写汇编语言程序的问题

要求实现:键入一个字符,统计出其中1的个数,并在屏幕上显示结果。

谢谢高手帮忙。我是初学者。希望注释清楚谢谢了。

键入字符就是DOS功能调用:
MOV AH,0AH ;键盘输入字符串 (10号/0A调用)
INT 21H ;从键盘上往指定缓冲区中输入字符串并送显示器显示
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-05-02
;键入一个字符,统计出其中1的个数,并在屏幕上显示结果
;Masm5.0运行通过。
code segment
assume cs:code,ds:code
org 100h
start:
push cs
pop ds
mov ah,1
int 21h ;从键盘读入一个字符,并回显
mov bl,al;保护读入的字符
mov bh,0
mov dl,':'
mov ah,2
int 21h ;向屏幕输出字符':'
mov bp,1 ;比较器送1
mov al,0 ;计数器清0
mov cx,8
LOP:test bx,bp ;统计“1”的个数
jz next
inc al;个数在al中
next:
rol bp,1;比较器左移1位
loop LOP
or al,30h
mov dl,al ;显示“1”的个数
mov ah,2
int 21h
mov ah,0
int 16h ;暂停
mov ah,4ch
int 21h ;退出
code ends
end start
第2个回答  2009-05-01
要怎么键入一个字符,我就不懂了,还没学到这。

assume cs:code

data segment
db '1234561'
data ends

code segment
start:mov ax,data
mov ds,ax ;ds存放数据段地址
mov bx,0
mov ax,0 ;ax记录字符1的个数
mov cx,7
s:mov dl,[bx] ;把数据段的数据放入dl
cmp dl,31h ;用cmp指令比较数据段中的数据是否与1相等,31即1
jne s1 ;如果不相等就跳到标号s1
inc ax
s1:inc bx
loop s

mov bx,0b800h
mov ds,bx ;将显示缓冲区的段地址赋给ds
mov ah,02 ;ah上放上字符样式,绿色
add al,30h ;现在ax存放着字符串中1的个数,所以要加30h即ASCII码才能正确显示出来
mov ds:[360h],ax ;放入显存
mov ax,4c00h
int 21h
code ends
end start
第3个回答  推荐于2016-01-08
; 本程序通过编译,运行正确
Code Segment
Assume CS:Code,DS:Code
KB_ESC equ 001BH
; -----------------------------------------
; 功能:输出一个字符
; 入口:dl=要显示的字符
enter_Chr proc Near
push ax
mov ah,02h
int 21h
pop ax
ret
enter_Chr endp
; -----------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -----------------------------------------
; 功能:取光标位置
; 入口:无
; 出口:DH=行号,DL=列号
GetCursor Proc Near
PUSH AX
PUSH BX
PUSH CX
XOR BX,BX
MOV AH,3
INT 10H
POP CX
POP BX
POP AX
RET
GetCursor EndP
; -----------------------------------------
; 功能:置光标位置
; 入口:Cursor_Row=行坐标; Cursor_Col: 列坐标)
SetCursor Proc Near
PUSH CX
PUSH BX
PUSH AX
XOR BX,BX
MOV AH,2
INT 10H
POP AX
POP BX
POP CX
RET
SetCursor EndP
; -----------------------------------------
; 功能:输出回车换行
enter_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
enter_CTLF endp
; -----------------------------------------
PromptStr DB 'Please input a charactor, ESC to exit): $'
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
Input_Chr: Output PromptStr ;提示输入一个字符
mov ah,1 ;从键盘接收一个字符
int 21h
cmp al,KB_ESC ;Esc?
je Exit_Proc ;是,结束程序
call GetCursor ;取光标位置
add dl,8 ;光标右移8个字符位
call SetCursor ;置光标位置
mov cx,8 ;一个字符,8个二进制位
xor dl,dl ;计数器清零
Counting: shl al,1 ;左移一位
jnc $+4 ;进位标志不置位,是0,不计数
inc dl ;进位标志置位,是1,计数
loop Counting ;下一位
or dl,30h ;转换成可以显示的ASCII码
call enter_Chr ;送显示屏显示
call enter_CTLF ;输出回车换行
call enter_CTLF ;输出回车换行
jmp Input_Chr ;再输入一个字符
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束本回答被提问者采纳
相似回答