2013-06-03 39 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