2013-06-03 42 views
0

我想統計輸入字符串中元音的數量,只寫成很小的字母。
我的代碼是這一個,但他不指望他們右側(cmp指令從未true我們如何計算程序集8086中字符串的元音數量?

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 

回答

0

你沒有一個循環,只是檢查字符串中的第一個字母,然後退出。

另外奇怪的是,你從s [1]加載cl,就好像長度存儲在字符串中一樣。或者如果長度在那裏,字符串數據可能在s [2],那必須反映在di中。

加載一次就足夠了,只需執行cmp指令即可。

+0

謝謝,你是對的, s [2]字段不存儲字符串的大小。我使用符號'$'來查找字符串的結尾。 – user8474

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. 
+0

'int 21h/0Ah'不會返回一個$終止的字符串。可能終止13(十進制) - 回車。計數(在中斷之後)在s [1]中 - 用來查找字符串的結尾。在中斷之前,'s [0]'是最大值。由於字符串是用空格初始化的,所以這將是32 ...到10字節的緩衝區。不好! (但它可能不會傷害你)最後,在dl中輸入一個數字不會打印數字。做'添加dl,'0'將打印一個單位數的數字......這可能已經足夠了...... –

+0

把'$'放在字符串的末尾,我用這個代碼:mov di,offset s [2];指向字符串 的真正開始mov bx,di; add bl,s [1];點右後的字符串(s pos + s size) mov [bx],'$' – user8474

+0

啊!好的,那就是$終止了!我的錯。 –

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