запись строки в другую с помощью вызова процедуры в mips

#mips

Вопрос:

эй, ребята, у меня есть практика, которую я не мог выполнить, и она в основном просит записать строку в другую, используя вызов процедуры, это мой код:

 .data

S: .ascii "My Name is Suliman."
T: .asciiz ""

.text

main:

la $s0, S            # Load address of first character
la $s1, T            # Load the address of second string

jal loop
sw $v0, T

j done

function:

 li $v0, 0   # this is T

loop:

lbu  $t2, 0($s0)        # Load the first byte of $s0 (str1) into $t2

sb   $t2, 0($v0)        # Save the value in $t2 at the same byte in $s1 (T)

addi $s0, $s0, 1        # Increment both memory locations by 1 byte
addi $v0, $v0, 1

bne  $t2, $zero, loop   # Check if at the zero delimiter character, if so jump to 
jr $ra
done:

li $v0, 4
la $a0, T
syscall                 # Print the copied string to the console

li $v0, 10              # Program end syscall
syscall
 

но я продолжаю получать эту ошибку, у кого-нибудь есть представление об этом?
Ошибка в /Приложениях/Q3.asm строка 23: Исключение во время выполнения при 0x00400028: адрес вне диапазона 0x00000000

Go: выполнение завершено с ошибками.

Комментарии:

1. sb $t2, 0($v0) # Save the value in $t2 at the same byte in $s1 (T) <- Что ты вообще там делал не соответствует тому, что вы говорите, что вы делаете в комментарий (обратить пристальное внимание на то, какие регистры вы используете).

2. не могли бы вы, пожалуйста, попытаться уточнить, где я этого не делал, потому что я действительно ненавижу этот курс, и мне нужно его закончить

Ответ №1:

.данные

 S: .asciiz "My Name is Ahmed Edhi"
T: .asciiz ""      
 
 

.текст

Главная:

 la $s0, S            
la $s1, T            

move $a0, $s0   # $a0, $a1 used as argument of procedure loop
move $a1, $s1
jal loop
j print
 

петля:

   # void method
  # no return statement here, if required use $v0, $v1 to return values

  lbu  $s2, 0($a0)                                
  sb   $s2, 0($a1)         
                        
  addi $a0, $a0, 1        
  addi $a1, $a1, 1      
 
  bne  $s2, $zero, loop 

  jr $ra
 

Печать:

   li $v0, 4
  la $a0, T               # Print string T to the console
  syscall                 

  li $v0, 10              # Program Ends
  syscall
 

Комментарии:

1. Я немного изменил ваш код и добавил несколько важных комментариев. Я надеюсь, что это может вам помочь.