1

ユーザーが入力した文字を取得し、それを再帰を使用して正しいアルファベット順の文字列に挿入し、別の文字を要求する必要があります。一度に入力できるのは 1 文字だけです。

文字列をスキャンして、入力された文字がアルファベット文字列の文字と一致する場合は、それを挿入するのが良い方法だと思いました。しかし、私はそれをコードに入れるのに苦労しています。また、再帰 (スタック、$jal、$jr $ra) を使用する必要がありますが、そのような使用方法に完全には慣れていません。

これまでの私のコードは次のとおりです。

        .data

    str: .asciiz "abcdefghijklmnopqrstuvwxyz .space 30" 
    input: .asciiz "Please input a letter: "
    error1: .asciiz "Error! Please only enter one lowercase letter!"
    print1: .asciiz "The string is: "


    .text

    main:
    la $s0,0
    li $v0,4
    la $a0,input
    syscall

    loop:
    li $v0,8
    syscall
    move $t0,$v0
    blt $t0,61,error #if less than a
    bgt $t0,80,error #if more than z
    bge $t0,0x50,print #when user enters P, print

    loop2:
    lb $t2,str($s0) #load first byte of string
    bge $t0,$t2,store #if input char=string char, store it
    addi $s0,$s0,1 #next char in string
    j loop

    store:
    sw $t0,str($s0) #store char in string
    addi $s0,$s0,1 #next char in string
    j loop

    error:
    li $v0,4
    la $a0,error1 #print error message
    syscall
    j loop #jump back to loop

    print:
    li $v0,4
    la $a0,print1 #print dialogue
    syscall
    li $v0,4
    la $a0,str #print string
    syscall
4

1 に答える 1

1

他のことに取り組む前に、この挿入がどのように機能するかを明確にする必要があります。文字を取り、それを既存の文字列に挿入しますよね?その場合、文字列で満たされた変更可能なバッファを作成する必要があることを意味します。.spaceディレクティブが行います。さらに、文字を挿入するため、大きなバッファーを割り当てる必要があります。そして最後に、文字を挿入することはシフトを意味するので、その準備をしてください.

現在、次のものがあります。

str: .asciiz "abcdefghijklmnopqrstuvwxyz"

その文字列を変更しようとしていると思いますが、文字列宣言は変更されることを意図していません。おそらくそれを変更して、プログラムを機能させることもできますが、そのようにすることはお勧めしません。複数の文字列を宣言すると (実際にそうします)、それらが連続して配置され、データを上書きする可能性があります。ユーザーに入力を求める前に、すべてを解決することに集中します。

次に、次のものがあります。

loop:
    li $v0,8
    syscall
    move $t0,$v0

syscall 8文字ではなく文字列を読み取ります。syscall 12文字を読み取ります。また、コンソールから文字列を読み取ろうとしたときに、 でバッファ アドレスを指定しませんでした$a0。次に、システム コールの結果を一時レジスタに移動しようとしますが、呼び出しは何も返しません。入力文字列をバッファに入れるだけです。

于 2012-04-18T20:07:40.927 に答える