Код MIPS не работает - PullRequest
       17

Код MIPS не работает

0 голосов
/ 08 апреля 2009

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

.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 ]

2 голосов
/ 08 апреля 2009

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

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
0 голосов
/ 08 апреля 2009

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

jr ra
...