宿題に必要です。ユーザーは、消去したい文字の文字列とインデックスを入力します。この文字とスペースを含まない文字列を返す必要があります。最後に試したのは、ある文字列から別の文字列に文字を 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