0

宿題に必要です。ユーザーは、消去したい文字の文字列とインデックスを入力します。この文字とスペースを含まない文字列を返す必要があります。最後に試したのは、ある文字列から別の文字列に文字を 1 つずつコピーし、削除したい文字をスキップすることです。例: 文字列 "asdfghjkl" を受信しました。3 番目の文字を削除したいので、文字列 "asfghjkl" を出力する必要がありますが、代わりに "ssfgggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg のようになります。さまざまな組み合わせを試し、カウンターで遊んだり、n の代わりに .space 128 を試したりしましたが、成功しませんでした。コードは QtSpim で実行されます

MIPS コードは次のとおりです。

.data
# $s0   str1
# $s7   str2

str1: .space n
str2: .space n
msg1:   .asciiz "Input your string\n\n"
msg2:   .asciiz "\nNumber of character to erase "
err:    .asciiz "error in number"
result: .asciiz "\nthe new string is\n\n"

.text

main:   
    la $a0, str1
add $s0, $a0, $0
la $a0, str2
add $s7, $a0, $0
la $a0, msg1    #Input your string
li $v0, 4
syscall

li $v0, 8   #Read input string to $s0
syscall
move $s0, $a0

la $a0, msg2    #Input your string
li $v0, 4
syscall 

li $v0, 5   #Read Number of character to erase to $s1
syscall
add $s1, $v0, $0    #Number of character to erase $s1==
addi $t0, $s1,-1    #Number of character to erase $t0
addi $t1, $0, 127   #$t1=127 counter

findchar:

ret:
lbu $t5, 0($s0) #copy chars from string1 to string1
sb $t5, 0($s7)

addi $t1, $t1, -1   #counter of whole string1
addi $t0, $t0, -1   #counter of the character we want to erise

addi $s0, $s0, 1    #move to next char
addi $s7, $s0, 1    #move to next char
beqz $t0, shift     #if we at char we want to erise, 
                            #we skip it in string1 and continue
beqz $t1, print     #if string is finished, print result
j findchar



print:  addiu $s7, $s7, -127    #return to first char of new string
la $a0, 0($s7)      #and print it
li $v0, 4
syscall



end:    li $v0, 10
syscall
shift:  addi $s0, $s0, 1    #skip erised char in string1
addi $t1, $t1, -1

j ret           #continue copy chars from string1 to string2

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

ありがとうございました。回答の後、コードを変更しましたが、$a1 から取得した「長さ」の値は 0x7ffff550 です。それが私の主な問題です - 私は正しい長さを得ることに成功していません.

.data
# $s0   str1
# $s7   str2

    str1: .space n
    str2: .space n
    msg1:   .asciiz "Input your string\n\n"
    msg2:   .asciiz "\nNumber of character to erase "
    err:    .asciiz "error in number"
    result: .asciiz "\nthe new string is\n\n"
.text

main:
    la $a0, str1
    add $s0, $a0, $0
    la $a0, str2
    add $s7, $a0, $0
    la $a0, msg1    #Input your string
    li $v0, 4
    syscall

    li $v0, 8   #Read input string to $s0
    syscall
    move $s0, $a0
    move $s6, $a1

    la $a0, msg2    #Input your Number of character to erase
    li $v0, 4
    syscall 
    li $v0, 5   #Read Number of character to erase to $s1
    syscall
    add $s1, $v0, $0    #Number of character to erase $s1==

    addi $t0, $s1,-1    #Number of character to erase $t0
    add $t1, $s6, $0    #$t1= counter of length

findchar:

ret:
    lb $t5, 0($s0)  #copy chars from string1 to string1
    sb $t5, 0($s7)

    addi $t1, $t1, -1   #counter of whole string1
    addi $t0, $t0, -1   #counter of the character we want to erise

    addi $s0, $s0, 1    #move to next char
    addi $s7, $s0, 1    #move to next char
    beqz $t0, shift     #if we at char we want erise, we skip it in string 1 and continue
    beqz $t1, print     #if string is finished, print result
j findchar

print:  
    la $a0, str2
    #sub $s7, $s7, $s6  #return to first char of new string
    #addi $t1, $t1, -1
    #sub $s7, $s7, $t6
    la $a0, 0($s7)      #and print reult string
    li $v0, 4
    syscall


end:    li $v0, 10
    syscall
shift:  addi $s0, $s0, 1    #skip erised char in string1
    addi $t1, $t1, -1

    j ret           #continue copy chars from string1 to string2
4

1 に答える 1

0

あなたのコードにはいくつかの問題があります。

  • 1 つ目は、コピーされた文字列に NULL ターミネータを追加していないように見えることです。これにより、文字列を印刷しようとすると、大量のゴミが印刷される可能性があります。

  • 2 つ目は、常に 127 回ループしますが、入力文字列が 127 文字になる可能性は低いということです。入力文字列の最後 (NULL ターミネータ) に到達したら、ループを停止する必要があります。

  • 3 つ目は、文字がコピーされた後にスキップ チェックが実行されるため、ユーザーが最初の文字を削除したい場合、実装が失敗することです。

また、必要以上に複雑なやり方の問題もあります。定数を再度ロードするだけでなく、以前の値に基づいて定数値を計算するコードのいくつかの場所を見ました。たとえば、addiu $s7, $s7, -127/la $a0, 0($s7)は単純な に置き換えることができますla $a0, str2。この種のものは、コードのどこかで何かを変更したために有効でなくなったものに依存しているため、コードが壊れたときに頭痛の種になるだけです.

于 2013-04-01T09:29:41.783 に答える