Простые MIPS для цикла не работает - PullRequest
0 голосов
/ 11 октября 2018

Я очень новичок в MIP и пытаюсь создать цикл for для назначения.

for (int i=1; i < 16; i+=2) 
{
       A[i] = A[i] + B[3*i]   
} 

С текущим кодом, который у меня есть, когда я пытаюсь загрузить значение A [i], оно говоритадрес извлечения не выровнен по границе слова.

Вот мой код:

main:  
    li      $t0, 1              # Starting index of t0=i 
    lw      $s7, aSize          # Loop bound  
    la      $s0, A              # &A
    la      $s6, endA           # &endA
    la      $s1, B              # &B
loop:
    #TODO: Write the loop code
    addi    $t3, $zero, 3   # $t3 = 3
    mul     $t4, $t0,$t3    # $t4 = i * 3
    sll     $t4, $t4, 2     # $t4 into a byte offset

    add     $s1, $s1, $t4   # $s1 = &B[i*3]
    add     $s0, $s0, $t0   # $s0 = &A[i]

    lw      $t1, 0($s0)     # value of A[i]
    lw      $t2, 0($s1)     # value of B[i * 3]

    add     $t2, $t1, $t2   # A[i] + B[i]
    sw      $t2, 0($s0)     # A[i] = A[i] + B[i]
    addi    $s0, $s0, 2
    addi    $s1, $s1, 2
    addi    $t0, $t0, 1     #i++
    bne     $t0, $s7, loop

Я очень плохо знаком с MIP, поэтому не уверен, что происходит или где вообще посмотреть.Я ценю любую помощь.

1 Ответ

0 голосов
/ 11 октября 2018

Когда вы делаете:

mul     $t4, $t0,$t3    # $t4 = i * 3

Вы вычисляете массив index [как в c].

Но, прежде чем вы сможете добавитьчто в базовый адрес массива, вам нужно преобразовать этот индекс в байт смещение.То есть вы должны умножить его на 4. Это можно сделать [как в c] со сдвигом влево на 2.

Итак, после mul выполните:

sll $t4,$t4,2

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


ОБНОВЛЕНИЕ:

Хорошо, что делаетсмысл.Я добавил это, но я все еще получаю эту ошибку границы слова в строке "lw $ t1, 0 ​​($ s0)"

Вы не показываете определение A или B, поэтому может возникнуть проблема с выравниванием.

Когда вы делаете:

add     $s1, $s1, $t4   # $s1 = &B[i*3]

Вы изменяете исходное / базовое значение &B[0].Это не то, что вы хотите.Используйте другой регистр для конечного значения адреса (то есть оставьте $s1 неизменным во всем цикле)

Сделайте что-то вроде:

add     $s3, $s1, $t4   # $s3 = &B[i*3]
lw      $t2, 0($s3)     # value of B[i * 3]

Настройте другие аналогичные регистры аналогичным образом (т.е.у вас похожая проблема с массивом A)

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

main:
    li      $t0,1                   # Starting index of t0=i
    lw      $s7,aSize               # Loop bound
    la      $s0,A                   # &A
    la      $s6,endA                # &endA
    la      $s1,B                   # &B
    addi    $t3,$zero,3             # $t3 = 3

loop:
    # TODO: Write the loop code
    mul     $t4,$t0,$t3             # $t4 = i * 3
    sll     $t4,$t4,2               # $t4 into a byte offset
    add     $s3,$s1,$t4             # $s3 = &B[i*3]

    sll     $t4,$t0,2               # $t4 into a byte offset
    add     $s2,$s0,$t4             # $s2 = &A[i]

    lw      $t1,0($s2)              # value of A[i]
    lw      $t2,0($s3)              # value of B[i * 3]

    add     $t2,$t1,$t2             # A[i] + B[i]
    sw      $t2,0($s2)              # A[i] = A[i] + B[i]

    addi    $t0,$t0,2               # i += 2
    bne     $t0,$s7,loop
...