Напишите программу, которая принимает на вход матрицу M с целыми положительными числами (другими словами, просто двумерный массив целых положительных чисел) размера rows x cols (где rows – число строк, cols –число столбцов), и возвращает транспонированную матрицу Mт(тоже двумерный массив целых положительных чисел) размера cols x rows. Если в M на пересечении i-ой строки j-ого столбца стояло число x, то на пересечении j-ой строки i-ого столбца матрице MTтоже будет стоять число x, другими словами MT[j] = M[j]
Porev123, ты можешь ему задавать вопросы по хуйне которой он высрал и если хоть немного тему знаешь то не обосрешься
Ниже приведу пример программы на ассемблере NASM для хранения матрицы построчно и для процессора Intel x86. Пусть матрица M хранится в памяти начиная с адреса M_ADDR. Тогда программа будет выглядеть так: section .data rows dw 3 ; число строк матрицы cols dw 4 ; число столбцов матрицы M_ADDR dd 0x1000 ; адрес начала матрицы M MT_ADDR dd 0x2000 ; адрес начала матрицы MT section .text global _start _start: mov bx, [rows] ; bx = число строк mov cx, [cols] ; cx = число столбцов mov esi, [M_ADDR] ; esi = адрес начала матрицы M mov edi, [MT_ADDR] ; edi = адрес начала матрицы MT xor eax, eax ; eax = 0 outer_loop: mov edx, eax ; edx = текущая строка mov ebx, cx ; ebx = число столбцов inner_loop: movzx ecx, word [esi + eax*2] ; ecx = M[edx][eax] mov word [edi + eax*2], cx ; MT[a][d] = M[d][a] add esi, 2 ; переходим к следующему элементу в строке M add edi, 2 ; переходим к следующему элементу в столбце MT dec ebx ; уменьшаем число столбцов jnz inner_loop ; если не все столбцы обработаны, то переходим к следующему add eax, 1 ; увеличиваем текущую строку cmp eax, bx ; сравниваем текущую строку с общим числом строк jl outer_loop ; если не все строки обработаны, то переходим к следующей mov eax, 1 ; код возврата 1 (успех) mov ebx, 0 ; код возврата 0 (ошибка) int 0x80 ; завершаем программу Code section .data rows dw 3 ; число строк матрицы cols dw 4 ; число столбцов матрицы M_ADDR dd 0x1000 ; адрес начала матрицы M MT_ADDR dd 0x2000 ; адрес начала матрицы MT section .text global _start _start: mov bx, [rows] ; bx = число строк mov cx, [cols] ; cx = число столбцов mov esi, [M_ADDR] ; esi = адрес начала матрицы M mov edi, [MT_ADDR] ; edi = адрес начала матрицы MT xor eax, eax ; eax = 0 outer_loop: mov edx, eax ; edx = текущая строка mov ebx, cx ; ebx = число столбцов inner_loop: movzx ecx, word [esi + eax*2] ; ecx = M[edx][eax] mov word [edi + eax*2], cx ; MT[a][d] = M[d][a] add esi, 2 ; переходим к следующему элементу в строке M add edi, 2 ; переходим к следующему элементу в столбце MT dec ebx ; уменьшаем число столбцов jnz inner_loop ; если не все столбцы обработаны, то переходим к следующему add eax, 1 ; увеличиваем текущую строку cmp eax, bx ; сравниваем текущую строку с общим числом строк jl outer_loop ; если не все строки обработаны, то переходим к следующей mov eax, 1 ; код возврата 1 (успех) mov ebx, 0 ; код возврата 0 (ошибка) int 0x80 ; завершаем программу Приведенная программа копирует матрицу M в транспонированную матрицу MT. Для этого она проходится по строкам матрицы M и по столбцам матрицы MT, копируя каждый элемент M[d][a] в MT[a][d]. После завершения работы программа возвращает код возврата 1 (успех) и завершается. Если произошла ошибка, то программа возвращает код возврата 0 (ошибка) и завершается.