用8086汇编语言编写程序,从键盘输入一段字符,以#结束,统计其中数字,字母,以及空格的个数。急急

2024-11-11 14:31:38
推荐回答(2个)
回答1:

为了简便,直接使用了21中断的输入字符串子功能,即使你不输入#作为结束符,也可以使用。
统计时,则将'#'后面的字符忽略
正确的作法,是调用21中断的1号子功能,每次读取一个字符,直到读取到'#'为止。
这个修改很简单,我就不再写了。

data segment
  buf db 255 ;
        db ?
            db 255 dup('$')
    c1 dw 0 ;spacebar
    c2 dw 0 ;digital number
    c3 dw 0 ;alphabet
    m1 db 0dh, 0ah, "Spacebar number:$"
    m2 db 0dh, 0ah, "Digital number:$"
    m3 db 0dh, 0ah, "Alphabet number:$"
data ends

code segment
        assume cs:code, ds:data
start:
        mov ax, data
        mov ds, ax
        mov es, ax

;code start here
; read string
        lea dx, buf
        mov ah,0ah
        int 21h

;
    xor cx, cx
        mov cl, buf+1
        mov si, 0
Loop1:
        mov al, buf[si+2]
        cmp al, '#'
        jz  lopend
        cmp al, 20h
        jz space
        cmp al, '0'
        jb alphabet
        cmp al, '9'
        ja alphabet
        inc c2      ;digital number
        jmp lop
space:
        inc c1      ;spacebar
        jmp lop
alphabet:
        inc c3
lop:
        inc si
        loop loop1

lopend:

; print result
        lea dx, m1
        mov ah, 9
        int 21h

        mov ax, c1
        call print

        lea dx, m2
        mov ah, 9
        int 21h

        mov ax, c2
        call print

        lea dx, m3
        mov ah,9
        int 21h

        mov ax, c3
        call print

;exit to OS
        mov ah,4ch
        int 21h

print proc near
        mov bx, 10
        xor cx, cx
Q0:
        xor dx, dx
        div bx
        or dx, 0e30h
        push dx
        inc cx
        cmp ax, 0
        jnz Q0
Q1:
        pop ax
        int 10h
        loop Q1
        ret
print endp

code ends

end start

回答2:

stack segment stack
byte 256 dup(0)
stack ends

data segment
C1 dw 0 ;空格数
C2 dw 0 ;数字数
C3 dw 0 ;字母数
C4 dw 0 ;其它字符数
BUFF db 64, 0, 64 dup(?) ;接收输入缓冲区,BUFF[0]存储缓冲区大小,BUFF[1]存储实际输入数,BUFF[2]开始为输入的数据
SHEX DB '0123456789ABCDEF$'
MSG1 db 13,10,'space: $'
MSG2 db 13,10,'number: $'
MSG3 db 13,10,'alpha: $'
MSG4 db 13,10,'other: $'
MSG5 db 'input your data, end to input #', 13, 10, '$'
data ends

code segment
assume cs:code,ss:stack,ds:data
START:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax

call GetInputData;

call CountInputData;

;输出空格数
mov dx, offset MSG1
mov ax, C1
call PrintLen

;输出数字数
mov dx, offset MSG2
mov ax, C2
call PrintLen

;输出字母数
mov dx, offset MSG3
mov ax, C3
call PrintLen

;输出其他数
mov dx, offset MSG4
mov ax, C4
call PrintLen
PROCEXIT:
; 程序退出
mov ax,4c00h
int 21h

;打印出长度,长度保存在AX里, DX里存储提示信息地址
PrintLen proc near
push ax
mov ah,9h
int 21h
pop ax

mov cx,4
PRINTLOOP:
rol ax,1
rol ax,1
rol ax,1
rol ax,1
push ax
mov dl,al
and dl,0FH
mov bx, offset SHEX
add bl,dl
mov dl, byte ptr [bx]
mov ah,2
int 21h
pop ax
loop PRINTLOOP
ret
PrintLen endp

CountInputData proc near
mov ch,0
mov cl, byte ptr[BUFF+1]
mov si, offset BUFF+2
MYLOOP:
mov al, [si]
inc si

cmp al,20h ;' '空格
je CCOUNT1
cmp al, '0' ;'0'
jl CCOUNT4
cmp al, '9' ;'9'
jle CCOUNT2
cmp al, 'A' ;'A'
jl CCOUNT4
cmp al, 'Z' ;'Z'
jle CCOUNT3
cmp al, 'a' ;'a'
jl CCOUNT4
cmp al, 'z' ;'z'
jle CCOUNT3
CCOUNT4:
inc C4
jmp NEXTLOOP
; 空格
CCOUNT1:
inc C1
jmp NEXTLOOP
; 数字
CCOUNT2:
inc C2
jmp NEXTLOOP
; 字母
CCOUNT3:
inc C3
jmp NEXTLOOP
NEXTLOOP:
loop MYLOOP
ret
CountInputData endp

;获取输出数据,输入数据保存在BUFF里,个数
GetInputData proc near
mov dx, offset MSG5
mov ah, 9h
int 21h

mov ch,0
mov cl,BUFF
lea bx,BUFF+2;
INPUTLOOP:
mov ah,1
int 21h
cmp al, '#'
jz EXITINPUT
cmp al, 13 ;跳过回车符
jz INPUTLOOP
cmp al, 10 ;跳过换行符
jz INPUTLOOP
inc byte ptr[BUFF+1]
mov byte ptr[bx], al
inc bx
loop INPUTLOOP
EXITINPUT:
ret
GetInputData endp

code ends

end START