1

ここで私の問題は何だろうと思っていました。文字列を逆向きに出力し、母音を数えるサブルーチンに正しい文字を読み込みますが、その文字を一番上の文字と比較する方法に問題があります。

基本的に、プログラムの最初に文字を定義して、それらを正しく比較できるようにするにはどうすればよいですか?

//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
4

1 に答える 1

1

文字は 1 バイトとして格納されます。たとえば、次のように比較する必要がありcmpb %cl, Aますcmpb %cl, 'A'。提案:それらを配列として扱い、それぞれを個別にテストする代わりに、それらを反復処理することができます。

また、スタック ポインターに追加する必要があるスタックから関数の引数をクリーンアップすることにも注意してaddl $4, %espくださいsubl $4, %espsubl $4, (%esp)

于 2012-11-16T14:00:01.997 に答える