Online Compiler Nasm

extern io_get_dec extern io_print_dec extern io_print_char section .bss n resd 1 m resd 1 k resd 1 cnt resd 1 matrix_a resd 10000 matrix_b resd 10000 matrix_c resd 10000 section .text global main main: call io_get_dec mov [n], eax call io_get_dec mov [m], eax call io_get_dec mov [k], eax .prep_matrix_a: mov edi, matrix_a ;edi - указатель на матрицу mov esi, 0 ;esi - элемент матрицы mov ebx, [n] imul ebx, [m] ;ebx - всего элементов в матрице .read_matrix_a: cmp esi, ebx je .prep_matrix_b push ecx push ebx call io_get_dec pop ebx pop ecx mov [edi], eax add edi, 4 inc esi jmp .read_matrix_a .prep_matrix_b: mov edi, matrix_b ;edi - указатель на матрицу mov esi, 0 ;esi - элемент матрицы mov ebx, [m] imul ebx, [k] ;ebx - всего элементов в матрице .read_matrix_b: cmp esi, ebx je .prep_matrix_c push ecx push ebx call io_get_dec pop ebx pop ecx mov [edi], eax add edi, 4 inc esi jmp .read_matrix_b .prep_matrix_c: mov edi, matrix_c ;указатель на матрицу mov esi, 0 mov ebx, [n] imul ebx, [k] .fill_matrix_c: cmp esi, ebx je .prep_print_matrix_c push ebx ;esi - счетчик элементов в matrix_c ;ecx - значение элемента ;eax - номер элемента ;ebx - [n] mov ecx, 0 mov eax, esi mov edx, 0 mov ebx, [k] ;eax - номер по строке ;edx - номер по столбцу ;c[eax][edx] - заполняем div ebx mov ebx, 0 mov dword [cnt], 0 jmp .sum .next: mov [edi], ecx add edi, 4 inc esi pop ebx jmp .fill_matrix_c .sum: ; += a[eax][ebx] * b[ebx][edx] ; += [matrix_a + (eax * m + ebx) * 4] * [matrix_b + (ebx * k + edx) * 4] ;edi = a[eax][ebx] push edi push esi mov edi, eax imul edi, [m] add edi, ebx mov edi, [matrix_a + edi * 4] ;esi = b[ebx][edx] mov esi, ebx imul esi, [k] add esi, edx mov esi, [matrix_b + esi * 4] ;edi = a[eax][ebx] * b[ebx][edx] imul edi, esi add ecx, edi inc ebx mov edi, ebx cmp edi, [m] pop esi pop edi jne .sum jmp .next .prep_print_matrix_c: mov edi, matrix_c ;edi - указатель на матрицу mov esi, 0 ;esi - элемент матрицы mov ebx, [n] imul ebx, [k] ;ebx - всего элементов в матрице ;[cnt] - счетчик столбцов .print_matrix_c: cmp esi, ebx je .end mov eax, [edi] call io_print_dec inc dword [cnt] mov eax, [cnt] cmp eax, [k] jne .print_prob mov dword [cnt], 0 mov eax, 10 call io_print_char add edi, 4 inc esi jmp .print_matrix_c .print_prob: mov eax, 32 call io_print_char add edi, 4 inc esi jmp .print_matrix_c .end: xor eax, eax ret
1) Этот код на NASM32 считывает две матрицы (A размером n×m и B размером m×k), перемножает их, сохраняя результат в матрицу C размером n×k, а затем выводит матрицу C построчно, разделяя элементы пробелами и строки символом новой строки.

2) Подсказки:
- Обрати внимание, что при вычислении индекса элемента в матрице (например, `a[eax][ebx]`) используется формула `eax * m + ebx`, но в коде пропущено восстановление регистра `eax` после операции `div ebx` в блоке `.fill_matrix_c`. Убедись, что `eax` (номер строки) сохраняется перед вычислениями.
- В блоке `.sum` регистр `ebx` используется как счётчик цикла и как индекс столбца в матрице A / строки в матрице B. После выхода из `.sum` для перехода к `.next` значение `ebx` уже изменено, что может повлиять на последующие операции, если предполагается его повторное использование.