Assembly_MIPS Не удалось поменять 2 строки - PullRequest
0 голосов
/ 29 мая 2019

У меня есть задание в ассемблере, где я должен поменять местами содержимое 2 элементов в массиве строк, причем каждый элемент имеет длину 8 бит.Я тестирую с двумя элементами массива.Сначала я загружаю строковый массив в $ s2, используя: la $ s2, строка Я сохранил первый элемент в $ t5, используя lw $ t5, ($ s2), и сохранил второй элемент в $ t6, используя lw $ t6, 8 ($ s2) и swapиспользуя:

lw $ t5, ($ s2) lw $ t6, 8 ($ s2) sw $ t6, ($ s2) sw $ t5, 8 ($ s2)

Но яимел ошибку: исключение времени выполнения в 0x00400074: адрес вне диапазона 0x000a7574 в строке 53

Вот общий код:

.data
.align 2
    string:     .space  1600       
    op:         .asciiz "Enter number of student:"
    prompt:     .asciiz "Enter name of student:"
    text:       .asciiz "The list of student after sort is:"
    newline:    .asciiz "\n"
.text
.globl main

main:
# prompt user for array length
    li          $v0,51
    la          $a0,op
    syscall

    addi        $s0,$a0,0           # $s0 contains the integer we read

    add         $t0,$zero,$zero     # index of  number array
    addi        $t1,$zero,1         # counter=1
    add         $t2, $zero,$zero   #index of string aeeay
    la          $s2,string          # load address of string storage area [NEW]
read_string:
    bgt      $t1,$s0, start_swap          # if ($t1 > length) then array is done -- fly
    #-------------------------------------------------
    # prompt the user for next student name
    li          $v0,54
    la          $a0,prompt
    la          $a1, ($s2)
    la          $a2, 20
    syscall

    #----------------------------------------------------


    addi        $s2, $s2,8          #+1 string array
    addi        $t1,$t1,1           # advance iteration count

    j           read_string

start_swap:
#TEST WITH 2 STUDENTS
la  $s2, string
lw  $t5, ($s2)
lw  $t6, 8($s2)
sw  $t6, ($s2)
sw  $t5, 8($s2)

#print first name
la          $a0,($t5)
li          $v0,4           #4 -> string    
syscall

la          $a0,($t6)
li          $v0,4           #4 -> string    
syscall

Я новичок в ассемблере, поэтому любая помощь будет оценена!!

...