2015-05-14 5 views
0

Мне нужно поменять два элемента массива. Я сделал это, но в lw $t2, 0($t0) #$t2 = array [i] он начинает сбой, и я не знаю, как его исправить.Сменить два элемента массива в MIPS

Вот код:

.data 

vector: .word 10, 20, 3, 20, 20, 50, 560, 100, 1005, 10 
J:  .word 0 
I:  .word 0 
cad: .asciiz  "Introduce el indice del primer elemento:\n" 
cad2: .asciiz  "Introduce el indice del segundo elemento:\n" 


    .text 

main: 

    la $a1, vector #cargo en a1 la dirección base del vector 
    la $a2, I  #cargo en a2 el índice i 
    la $a3, J  #cargo en a3 el índice j 
    move $a1, $zero #inicializo i a cero 
    move $a2, $zero #inicializo j a cero 

    li $v0,4  #imprimo un string 
    la $a0, cad 
    syscall 

    li $v0, 5  #leo el primer índice 
    syscall 

    move $a1, $v0 #muevo el entero de v0 a a1 
    li $v0,4  #imprimo un string 
    la $a0, cad2 
    syscall 

    li $v0,5  #leo el segundo índice 
    syscall 

    move $a2, $v0 #muevo el entero de v0 a a2 

    sll $t0, $a2,2  # $t0 = i*4 
    add $t0, $t0, $a1 # $t0 contiene la dirección del vector[i] 
    sll $t1, $a3, 2  # $t1 = j*4 
    add $t1, $t1, $a1 # $t1 contiene la dirección del vector[j] 

    lw $t2, 0($t0)  #$t2 = array [i] 
    lw $t3, 0($t1)  #$t3 = array[j] 
    sw $t2, 0($t1)  #array[j]=array[i] 
    sw $t3, 0($t0)  #array[i]=previous values of array[j] 
    syscall  

    li $v0,1 
    la $a0, vector 
    syscall 
    li $v0, 10 
    syscall 

Спасибо за помощь, и жаль, если я сказал что-то не так, как вы видите, я из Испании.

+0

Поскольку вы, кажется, используете SPIM или MARS, вы можете видеть содержимое регистров. Соответствует ли значение '$ t0' тому, что вы ожидали, когда программа выйдет из строя? Если нет, подумайте, почему это могло закончиться неправильным значением. Или еще лучше, используйте одноступенчатую функциональность вашего тренажера для выполнения вашей программы и убедитесь, что все значения регистра верны для каждой выполняемой команды. – Michael

ответ

0

Глядя на ваш код я вижу две проблемы:

Вы используете $a1 для хранения базового адреса vector, но $a1 используется в качестве аргумента для некоторых системных вызовов. Посмотрите в свой код, и вы увидите, что вы переписываете $a1 за syscall. Я предлагаю вам использовать другой регистр для хранения базового адреса вектора.

Вы также перезапись $a1, когда вы хотите, чтобы инициализировать переменные индекса (я и J), в соответствии с вашим кодом они должны быть $a2 и $a3.

Смежные вопросы