Я не имею никакого представления об операциях с массивами с изменяющимися переменными, такими как 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, для каждого из них будет регистр ЦП.