0

私の MIPs アセンブリ プログラミング クラスでは、文字列を単純化されたピッグ ラテン語に変換するプログラムを作成する任務を負っています。

簡略化された豚ラテン語では、文字列内のすべての単語が少なくとも 2 文字の長さであり、すべての単語の最初の文字が最後にシフトされ、その後に「ay」が続くと想定されます。また、いかなる種類の句読点もないと仮定します。

つまり、「stackoverflow is great」は「tackoverfloway siay reatgay」になります。

私はこのプログラムを試してみましたが、ほぼ完了しています。何らかの理由で毎回最後の単語の途中で改行があることを除いて、それは正常に機能します。

例えば:

tackoverflowsay siay reat
ゲイ

それ以外の:

tackoverflowsay siay reatgay

プログラムの最後の終了部分でこの改行の原因を突き止めようとしましたが、わかりません。未熟なヌル終了文字列がありますか? もしそうなら、私はそれを見ません。

これが私のコードです:

####################################################
#  Text Segment
####################################################
        .text
        .globl main
main:
        la $t0, char
        la $t1, buffer
        lb $t3, space

        la $a0, prompt
        li $v0, 4
        syscall

        la $a0, buffer
        li $a1, 200
        li $v0, 8
        syscall

        lb $t2, ($t1)           # Load first char
        addi $t1, $t1, 1

loop:
        lb $t4, ($t1)           # Load next character into $t4

        addi $t1, $t1, 1
        beqz $t4, exit          # Reached end of string, exit?  
        beq $t3, $t4, loop2     # If $t4 = " " char, second loop

        move $a0, $t4           # else, lets keep printing chars
        li $v0, 11
        syscall

        j loop

loop2:
        move $a0, $t2
        li $v0, 11
        syscall

        la $a0, aystr
        li $v0, 4
        syscall

        lb $t2, ($t1)   
        addi $t1, $t1, 1    

        j loop
exit:

        move $a0, $t2
        li $v0, 11
        syscall

        la $a0, aystr
        li $v0, 4
        syscall

        li $v0, 10
        syscall         # Cya...

####################################################
#  Data Segment
####################################################

        .data
prompt: .asciiz "Enter Phrase: "
result: .asciiz "Pig Latin: "
space:  .ascii " "
aystr:  .asciiz "ay "
char:   .byte 1
buffer: .byte 200
4

1 に答える 1

2

ほとんどの場合、次の形式の文字列があります。

stackoverflow is great\n

\n改行文字です。これは次のように変換されます。

tackoverflowsay siahy reat\ngay

単純に単語の終わりをスペースまたは null ターミネータとして検出した場合。

(これは宿題なので) コードを提供するつもりはありませんが、私の意見では、最も簡単な解決策は、すべての"\n"文字をスペースに置き換えて、文字列全体を処理する別のループを作成することです。

これは、ラテン語化がループする前に行われます。

于 2009-04-01T03:19:13.427 に答える