在8086汇编中取字符串并计算其中的字符

时间:2018-04-10 17:17:22

标签: assembly masm x86-16

我目前正在尝试编写程序集中的代码,以便从用户那里获取一些字符串并计算出' a'其中的人物。这项工作似乎非常简单,但问题是我无法正确计算并且不知道问题是什么。例如,对于单词' amin',输出为97,或者对于其他类似于> 6的输出。 8086装配互联网的教程并不多。所以,如果有人能提供帮助,我会感激不尽。

stk     segment
    dw 32 dup(?)
stk     ends

dts     segment
    p1 db 10,13,'Please enter max 80 char',10,13,'$'
    p2 db 10,13,'Number of (a) chars:  $'
    max db 80
    len db ?
    count db 0
    char db 'a'
    str db 80 dup (?)
dts ends

cds     segment
    assume cs:cds, ss:stk, ds:dts
    main proc far
        mov ax, seg dts
        mov ds,ax
        mov ah,09
        mov dx,offset p1
        int 21h

        mov ah,0ah
        mov dx,offset max
        int 21h

        lea si,str
        mov cl,len
        mov ch,0 ; Initializing CX(Counter) Register for loop
check:
        mov al,[si]
        cmp char,al
        jne skip
        inc count
skip:
        inc si; Next char in str
        loop check

        mov al,count
        mov ah,0
        mov dl,10
        div dl
        add ax,3030h; making the right ascii code for printing
        mov bx,offset max-3
        mov [bx],ax
        mov ah,09
        mov dx,offset p2
        int 21h

        mov ah,4ch
        int 21h

    main endp
cds ends

    end main

1 个答案:

答案 0 :(得分:2)

int 21h,ah = 0ah将用户输入读入DS:DX的缓冲区。 DS:DX指向的缓冲区的第一个字节是最大长度,后跟实际长度,后跟读取的字符。您需要在len之后立即定义str;否则输入会覆盖countchar。得到97的原因是count被输入的第一个字符覆盖。

为了使代码更清晰,我建议像这样编写:

buf:
    max db 80
    len db ?
    str db 80 dup (?)

count db 0
char db 'a'

然后在int 21h之前,啊= 0ah,

    mov dx, offset buf