0

入力文字列の母音の数をカウントしたいのですが、極小のみで書かれています。
私のコードはこれですが、彼はそれらを正しく数えません(cmp命令は決してありませんtrue

data segment 
      s db 10 dup(' ')
data ends

code segment 

assume ds:data, cs:code

debut: mov ax,data
mov ds,ax

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

mov cl,s[1] 
mov di,offset s
mov bx,0

nr_vocale: cmp cl,0
je sfarsit
mov al,[di]
cmp al,'a'
je increment
mov al,[di]
cmp al,'e'
je increment
mov al,[di]
cmp al,'i'
je increment
mov al,[di]
cmp al,'o'
je increment
mov al,[di]
cmp al,'u'
je increment
inc di
dec cl


increment:  inc bx
 sfarsit: mov dl,bl
 mov ah,2
 int 21h

 mov ah,4ch
 int 21h

 ends code
end debut
4

3 に答える 3

1

ループはありません。文字列の最初の文字をチェックして終了します。

また、長さが文字列に格納されているかのように、s[1] から cl をロードするのも奇妙です。または、長さがそこにある場合、文字列データはおそらく s[2] にあり、それが di に反映されている必要があります。

al を 1 回ロードして、cmp 命令を実行するだけで十分です。

于 2013-06-03T14:54:53.790 に答える
0

これは母音を数えます

countvowels:                     
mov di,VOWL                     
mov si,STR                      
mov bp,di                       
mov cx,END                      
mov bx,STR                      
sub cx,bx             ;stringlength for loop          
dec cx                ;adjust for cx looping         
push cx               ;saved for repeating          
sub si,1              ;tweak si          

nextletter:                      
inc si                          
mov al,[si]                     

vowelrotate:                     
cmp al,[di]                     
jz addone                       
loop nextletter                 
inc di                ;vowel pointer rotate at end of string          
mov si,STR-1          ;return to start of string          
pop cx                ;loop count for string          
push cx                         
mov ah,"x"            ;check for end of vowels           
cmp [di],ah                     
jz finished                     
jmp nextletter                  

addone:                ;vowel count          
inc dx                          
jmp nextletter                  

finished:                        
##                              

VOWL                            
db "aeioux"                     
STR                             
db "input string from keyboard"         
END                             
于 2013-06-04T10:47:32.863 に答える
0

sコメントに従って、それが文字列オフセットと文字列ターミネータであると仮定すると$、次のことができます。

        mov    si,offset s    
        cld                ; Scan forward
        mov    bx,0        ; bx is count of vowels
check:
        lodsb              ; Load string byte DS:SI in AL and increment SI
        cmp    al, '$'     ; Terminator?
        je     finished
;;      or     al, 20h     ; Set string to lower case (optional)
        cmp    al, 'a'     
        je     increment
        cmp    al, 'e'     
        je     increment
        cmp    al, 'i'     
        je     increment
        cmp    al, 'o'     
        je     increment
        cmp    al, 'u'     
        je     increment
increment:
        inc bx
        jmp    check       ; repeat
finished:
        ;; BX holds the number of vowels.
于 2013-06-03T17:58:22.040 に答える