MIPS Сохранение в регистр, где адрес является переменной - PullRequest
0 голосов
/ 08 марта 2019

Итак, я делаю домашнее задание, и проблема в том, чтобы попросить меня сохранить инструкцию в реестре.это проблема.

Предположим, что значения a, b, i и j находятся в регистрах $ s0, $ s1, $ t0 и $ t1 соответственно.Кроме того, предположим, что регистр $ s2 содержит базовый адрес массива D.

for(i=0; i<a; i++) 
for(j=0; j<b; j++)
D[4*j] = i + j;

, который необходимо записать в MIPS, и у меня почти 90% его, с чем у меня возникают проблемы, это сохранениерезультаты от i + j до D [4 * j].это код, который у меня есть внутри вложенного цикла.

add $t2, $t0, $t1 # add i to j and store to temp
sll $t3, $t1, 4 # offset of j*4
add $t3, $s2, $t3 #add offset with base of D

обычно, другие проблемы дают мне значение адреса, как B [8], так что я бы просто использовал константу 32. нос сохранением с использованием переменной, я не уверен, как это сделать, так как это требует константы.Я почти уверен, что sw $t2, 0($t3)($s2) не будет работать.Я просто пропускаю очевидное?

1 Ответ

0 голосов
/ 08 марта 2019

Самое простое решение - увеличить ваш адрес на 4 * 4 (если D - массив int с).

Это соответствует следующему коду C:

for(int i=0; i<a; i++)
    for(int j=0, int *pd=&D[0]; j<b; j++,pd+=4)
        *pd=i+j;

И с вашей гипотезой может быть реализация mips

Предположим, что значения a, b, i и j находятся в регистрах $ s0, $ s1, $ t0 и $ t1 соответственно,Кроме того, предположим, что регистр $ s2 содержит базовый адрес массива D.

      add  $t0,$r0,$r0   #j=0
loopi:
       addi $t1,$r0,$r0   #j=0
       mov  $t3,$s2       #$t3=@D
loopj:
       add  $t2, $t0, $t1#add i to j and store to temp
       sw   $t2, 0($t3)  #store result in *t3
       addi $t3, 16      #t3+=4
       addi $t1, 1       #j++
       blt  $t1,$s1,loopj#j<b?
       addi $t0,1        #i++
       blt  $t0,$s0,loopi#i<a?

Кстати, цикл j записывает предыдущие значения D для последующих ì и толькопоследнее значение останется в D.Возможно, ваш код неверен.Или его можно заменить на

for(int j=0; j<b; j++)
        D[4*j]=a-1+j;
...