A dd 3,4,1,2,5,6,7,8,9
n dd 9
Здесь отсутствует важный номер. Ваша матрица является квадратной матрицей ранга 3 .
A dd 3,4,1,2,5,6,7,8,9
n dd 9
r dd 3
Ваш процесс транспонирования может использовать вложенные циклы, как показано в коде ниже.
Исходный индекс ESI
для массива A принимает эти значения. Это смещения в массиве.
0, 4, 8, 12, 16, 20, 24, 28, 32
Целевой индекс EDI
для массива Tr принимает эти значения. Это индексы , которые будут масштабироваться с помощью *4
.
0, 3, 6, 1, 4, 7, 2, 5, 8
Каждое выполнение внутреннего цикла распределяет элементы всей строки исходной матрицы. То, что делает внешний цикл, это перемещение начальной точки, которую будет использовать внутренний цикл, на одну позицию дальше.
xor ebx, ebx
xor esi, esi
OuterLoop:
mov edi, ebx ; Set starting point
InnerLoop:
mov eax, A[esi]
mov Tr[edi*4], eax
add esi, 4
add edi, r
cmp edi, n
jb InnerLoop
inc ebx ; Move starting point
cmp ebx, r
jb OuterLoop
Графическое объяснение см. На рисунках в ответе на это мое недавнее Q / A мое по обзору кода