- 2069 Poush · 8 marks
8086 ALP: count vowels and display string
Short answer
Read the string, classify each character with CLASSIFY, and increment VCNT whenever AL=1 (vowel). Clear the screen, terminate the string with '$', display it, then print the vowel count in decimal. For 'education', the count is 5.
Write an assembly language program for 8086 to read a string, count number of vowels in the string and display the string and its vowels count in a clear screen.
Method: read the string, count its vowels with CLASSIFY (AL = 1 means vowel) in the variable VCNT, then clear the screen and display the string followed by the vowel count in decimal.
.MODEL SMALL
.STACK 100H
DISPSTR MACRO MSG ; display a '$'-terminated string
LEA DX,MSG
MOV AH,09H
INT 21H
ENDM
CLRSCR MACRO ; clear screen and home the cursor
MOV AX,0600H ; scroll whole window (AL=0 -> blank it)
MOV BH,07H ; normal attribute
MOV CX,0000H ; upper-left corner (row 0, col 0)
MOV DX,184FH ; lower-right corner (row 24, col 79)
INT 10H
MOV AH,02H ; set cursor position
MOV BH,00H ; page 0
MOV DX,0000H ; row 0, col 0
INT 10H
ENDM
.DATA
MSG1 DB 'Enter a string: $'
MSG2 DB 'String : $'
MSG3 DB 'Number of vowels = $'
VCNT DB 0
BUF DB 80, ?, 80 DUP(0) ; DOS buffered-input area (max, actual, chars)
CRLF DB 13,10,'$'
.CODE
MAIN PROC
MOV AX,@DATA
MOV DS,AX
DISPSTR MSG1 ; prompt
LEA DX,BUF ; read the string with DOS function 0Ah
MOV AH,0AH
INT 21H
LEA SI,BUF+2
MOV CL,BUF+1
MOV CH,0
JCXZ SHOW
NEXT:
MOV DL,[SI]
CALL CLASSIFY ; AL = 1 if vowel
CMP AL,1
JNE SKIP
INC VCNT ; count vowel
SKIP:
INC SI
LOOP NEXT
SHOW:
MOV BL,BUF+1
MOV BH,0
MOV BYTE PTR BUF[BX+2],'$' ; terminate string
CLRSCR
DISPSTR MSG2
LEA DX,BUF+2
MOV AH,09H ; display the string
INT 21H
DISPSTR CRLF
DISPSTR MSG3
MOV AL,VCNT
XOR AH,AH
CALL PRINT_DEC ; display count
MOV AH,4CH ; return to DOS
INT 21H
MAIN ENDP
; ---- classify the character in DL
; returns AL = 1 vowel, 2 consonant, 0 not a letter (DL unchanged)
CLASSIFY PROC
MOV AL,DL
OR AL,20H ; fold to lower case (valid for letters)
CMP AL,'a'
JB NOTLET
CMP AL,'z'
JA NOTLET
CMP AL,'a'
JE VOW
CMP AL,'e'
JE VOW
CMP AL,'i'
JE VOW
CMP AL,'o'
JE VOW
CMP AL,'u'
JE VOW
MOV AL,2 ; consonant
RET
VOW:MOV AL,1 ; vowel
RET
NOTLET:MOV AL,0 ; not a letter
RET
CLASSIFY ENDP
; ---- print the unsigned number in AX in decimal (registers preserved)
PRINT_DEC PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV BX,10
XOR CX,CX ; digit counter
PD1:XOR DX,DX
DIV BX ; AX = quotient, DX = remainder (digit)
PUSH DX
INC CX
OR AX,AX
JNZ PD1
PD2:POP DX ; digits come out in correct order
ADD DL,30H ; to ASCII
MOV AH,02H
INT 21H
LOOP PD2
POP DX
POP CX
POP BX
POP AX
RET
PRINT_DEC ENDP
END MAIN
Output for education: String : education and Number of vowels = 5.
✓ Answer checked by Claude Opus 5.5 (high effort)
Related questions
- 8086 ALP: count vowels, consonants, numerals · Microprocessor, chapter 3
- 8086 ALP: words on lines and word count · Microprocessor, chapter 3
- 8086 ALP: vowels to uppercase, counts · Microprocessor, chapter 3
- 8086 ALP: vowels and consonants separately · Microprocessor, chapter 3
- 8086 ALP: largest and smallest, display · Microprocessor, chapter 3
- 8086 ALP: display only alphabetic characters · Microprocessor, chapter 3
- Count number of 1s in ROM data · Embedded System, chapter 9 · asked 2×
- Count number of 0s in ROM data · Embedded System, chapter 9 · asked 2×