Samuel French
Samuel French

Reputation: 665

trouble with comparing two characters

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

Answers (1)

Jester
Jester

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

Related Questions