Это точный вопрос:
Следующий код транспонирует элементы массива M x M, где M
константа, определенная #define:
void transpose(Marray_t A) {
int i, j;
for (i = 0; i < M; i++)
for (j = 0; j < i; j++) {
int t = A[i][j];
A[i][j] = A[j][i];
A[j][i] = t;
}
}
При компиляции с уровнем оптимизации -02 GCC генерирует следующее
код для внутреннего цикла функции:
1. .L3
2. movl (%ebx),%eax
3. movl (%esi,%ecx,4),%edx
4. movl %eax, (%esi,%ecx,4)
5. addl $1, %ecx
6. movl %edx, (%ebx)
7. addl $52,%ebx
8. cmpl %edi,%ecx
9. jl .L3
A. Какова стоимость М?
B. Какие регистры содержат значения программы i и
J?
C. Напишите версию транспонирования C-кода, которая использует
оптимизации, которые происходят в этом цикле. Используйте параметр M в вашем
код, а не числовая константа.
Итак, в моих попытках понять это, я заметил, что он умножается на 4, что означает, что он хранит типы 4 байта (может быть, int или указатель). Затем он увеличивает i на 52 долл. (Я полагаю, i), поскольку это большее значение, и, следовательно, переход к следующему массиву), а 52/4 равняется 13. Поэтому я бы предположил, что M = 13. Неверно?
Для B я бы предположил, что% ebx содержит i, а% ecx содержит i.
Для C я не совсем уверен, потому что я не совсем понимаю представленный цикл. Позвольте мне попытаться понять по номеру строки и сказать мне, где я не прав. 1. очевидно, это начало метки цикла. 2. перемещает предположительно значение i в% eax. Тогда 3. сохраняет A [i] [j] в t. Но ... я действительно не понимаю этого. :/ Помогите??