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



我目前正在尝试在汇编中编写代码,用于从用户那里获取一些字符串并计算其中的"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
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 之前,ah=0ah,

    mov dx, offset buf

最新更新