2009-04-08 2 views
0

Я работаю над некоторым кодом MIPS для моего класса Computer Organization, и я просто не могу заставить MIPS работать правильно, и в Интернете не так много ресурсов MIPS. Я запускаю код на PCSPIM. Предполагается, что код добавит 10 к содержимому массива2 и сохранит их в массиве1, а затем распечатает массив 1. Переработанный код работает правильно.Код MIPS сломанный

.text 
main: 
    la $t0, array1 
    la $t1, array2 
    la $s0, valuec 
    li $s2, 6 
    add $t6, $zero, 1 #i = 1 

Loop: 
    addi $t6, $t6, 1 #i++ 

    lw $t2, ($t0) 
    lw $t5, ($t1) 
    lw $s1, ($s0) 
    addu $t2, $t5, $s1 
    sw $t2, ($t0) 
    add $t0, $t0, 4 
    add $t1, $t1, 4 
    li $v0, 1 
    move $a0, $t2 
    syscall 
    blt $t6, $s2, Loop 

    li $v0, 10 
    syscall 
.data 
    array1: .space 20 
    array2: .word 1,2,3,5,9 
    valuec: .word 10 

PCSPIM печатает 0 5 раз и возвращает исключение 7 [Неверные данные Адрес] произошли и игнорировало

ответ

2

Это домашнее задание, поэтому я собираюсь дать вам подсказки сейчас и добавить к нему, когда вы идете. Несколько вещей:

1/Вы должны сообщить нам, что это такое предположительно. Это самое главное.

2/Вы сохраняете адрес array1 в t0, затем повторно используете t0 в первом цикле.

3/Вы, кажется, путаетесь с адресами и содержимым этих адресов ("la $s0, valuec" и "addu $t0, $t1, $s0").

UPDATE:

На самом деле я должен подписать на некоторое время, так что я выложу свое решение так, чтобы не оставить в беде.

Путаница, о которой я упомянул ранее, заключалась в том, что вы загружаете два адреса в $ t1 и $ s0, а затем добавляете их вместе, чтобы получить другой адрес - это, вероятно, далеко за пределами вашей области данных (вы должны действительно добавляем адрес и смещение).

Это в основном проблема, с которой вы столкнулись с вашим кодом (оба нули печатаются и сбой). Лучше всего было бы исправить это и ссылаться на мой код ниже только в крайнем случае, чтобы увидеть, как бы я это сделал. Копирование кода вам не поможет в долгосрочной перспективе, и вам было бы разумно предположить, что ваш педагог также проверяет все веб-сайты для плагиата.

Это код, который я придумал (быстро, так что вам нужно его протестировать - у него могут быть ошибки). Я предлагаю вам прочитать комментарии в отлично подробно, чтобы понять, что он делает.

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

.text 
main: 

# Initialization of array pointers and loop 

    la  $t0, array1  # address of array 1 
    la  $t1, array2  # address of array 2 
    li  $t2, 1   # element number 
    li  $t3, 6   # upper limit of elements 

# Process each word in array 2, adding 10 and placing 
# into array 1. 

Loop: 
    lw  $t3, 0($t1)  # get word from array 2 
    addi $t3, $t3, 10  # add 10 to word 
    sw  $t3, 0($t0)  # store word into array 1 
    addi $t0, $t0, 4  # move to next entry in array 1 and 2 
    addi $t1, $t1, 4 
    addi $t2, $t2, 1  # increment element number 
    blt  $t2, $t3, Loop # loop until all elements done 

# Initialize printing loop by going back to start of array 1 

    la  $t0, array1  # address of array 1 
    li  $t2, 1   # element number 

# Loop through array 1, printing each element. 

pLoop: 
    lw  $t2, 0($t0)  # get word from array 1 
    li  $v0, 1   # 'print' command code 
    move $a0, $t2   # needs value in $a0 
    syscall     # print it 
    addi $t0, $t0, 4  # move to next entry in array 1 
    addi $t2, $t2, 1  # increment element number 
    blt  $t2, $t3, Loop # loop until all elements done 

    li  $v0, 10   # 'terminate' command code 
    syscall     # exit 

# Data arrays for array 1 and 2 

.data 
array1: .word 0,0,0,0,0 
array2: .word 1,2,3,4,5 
-1

Там есть ряд возможных проблем, но наиболее очевидные/вероятно, является то, что вы не возвращаются из основных перед началом раздела данных.

jr ra 
+0

Я думаю, что это обработано окончательным syscall с кодом команды $ v0, установленным в 10. – paxdiablo

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