Операции с массивами и циклы на MIPS - PullRequest
0 голосов
/ 08 октября 2019

Я новичок в ассемблере, и мне нужна помощь через цикл C, чтобы преобразовать его в код MIPS. У меня есть следующий цикл:

int A[40], B[40], i;
for (i=1; i < 40; i++) {
    B[i] = A[i] + A[i-1];
    A[i] = 5*B[i] ;
}

Я не имею никакого представления об операциях с массивами с изменением переменных, таких как я в этом примере.

1 Ответ

2 голосов
/ 08 октября 2019

Я не имею никакого представления об операциях с массивами с изменяющимися переменными, такими как i в этом примере.

Просто делайте то, что говорит код C, и не беспокойтесь о том факте, чтосодержимое массива меняется во время цикла. Для B[i] = A [i] + A[i-1] ===> вычислить i * 4 + A, загрузить это, вычислить (i-1) * 4 + A, загрузить это, сложить их вместе, вычислить i * 4 + B, сохранить результат сложения там .. .

Через некоторое время вы можете увидеть, что A[i] и A[i-1] и B[i] могут совместно использовать некоторые вычисления адресов (например, все они используют i * 4), но это не обязательно в качестве первого шага. шаг - так, просто делайте то, что говорит код C: переводите каждый маленький кусочек буквально. Ваша первая цель - заставить сборку работать так же, как C - не пытайтесь оптимизировать алгоритм C при переводе на сборку.

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

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


Чтобы дать вам представление о том, как мы могли бы оптимизировать это в C:

int A[40], B[40], i;
for (i=1; i < 40; i++) {
    int temp = A[i] + A[i-1];
    B[i] = temp;
    A[i] = 5*temp;
}

Мы делаем небольшие изменения, как указано выше. И тогда, может быть:

int A[40], B[40], i;
int lastA = A[0];
for (i=1; i < 40; i++) {
    int temp = A[i] + lastA;
    B[i] = temp;
    lastA = 5*temp;
    A[i] = lastA; 
}

Эти локальные переменные temp и lastA будут очень хорошо работать в сборке MIPS, для каждого из них будет регистр ЦП.

...