Reputation: 665
I was wondering what my issue is here. It prints the string backwards, and does read in the correct character to the subroutine where it counts the vowel, but there is something wrong with how it compares the character to the character in the top.
Basically, how do I define the characters in the beginning of the program so I can compare them correctly?
//trying to make FMT_CHR2 work
PROMPT:
.ascii "Enter the lowercase string to evaluate: \0"
FMT_STR:
.ascii "%s\0"
FMT_INT:
.ascii "%d\0"
FMT_CHR:
.ascii "%c\0"
FMT_CHR2:
.ascii "\n FMTCHR2 %c\n\0"
ENDTEST:
.ascii "\0"
A: .ascii "a"
E: .ascii "e"
I: .ascii "i"
O: .ascii "o"
U: .ascii "u"
TEST: .ascii "TEST\n\0"
RESULT: .ascii "\n Your string has %d non-blank characters\0"
.section .data
county: .long 0
vowelCounter: .long 0
.globl _main
.section .text
_main:
pushl %ebp # save old frame ptr
movl %esp,%ebp # set new frame ptr & save local var space
//create local variable space
subl $100,%esp
pushl $PROMPT
call _printf
subl $4,%esp
leal -4(%esp),%ebx
pushl %ebx
call _gets
subl $4,%esp
pushl (%ebx)
call _rprint
subl $4,%esp
pushl county
pushl $RESULT
call _printf
subl $4,%esp
pushl vowelCounter
pushl $FMT_INT
call _printf
subl $4,%esp
leave
ret
_rprint:
pushl %ebp
movl %esp,%ebp
cmpb $0,(%ebx)
je ending
call _vowelcount
pushl (%ebx)
addl $1,%ebx
call _rprint
pushl $FMT_CHR
call _printf
subl $4,(%esp)
incl county
ending: leave
ret
_vowelcount:
push %ebp
movl %esp,%ebp
movl (%ebx),%ecx
pushl %ecx
push $FMT_CHR2
call _printf
cmpl %ecx,A
je _vAdd
cmpl %ecx,E
je _vAdd
cmpl %ecx,I
je _vAdd
cmpl %ecx,O
je _vAdd
cmpl %ecx,U
je _vAdd
jmp end2
_vAdd:
incl vowelCounter
end2: leave
ret
Upvotes: 1
Views: 145
Reputation: 58762
The characters are stored as single bytes. You should compare them as such, for example: cmpb %cl, A
should work, or directly cmpb %cl, 'A'
. A suggestion: you could treat them as an array, and just iterate through them instead of testing each one separately.
Also note to clean up function arguments from the stack you should add to the stack pointer, for example addl $4, %esp
and not subl $4, %esp
and definitely not subl $4, (%esp)
Upvotes: 1