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 ecx pop ebx 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 .end push ecx push ebx call io_get_dec pop ecx pop ebx 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 .end ;esi - счетчик элементов в matrix_c ;ecx - значение элемента ;eax - номер элемента ;ebx - [n] mov ecx, 0 mov eax, esi mov edx, 0 mov ebx, [n] ;eax - номер по строке ;edx - номер по столбцу ;c[eax][edx] - заполняем div ebx mov ebx, 0 mov [cnt], 0 jmp .sum .next mov [edi], ecx add edi, 4 inc esi jmp .fill_matrix_c .sum: ; += a[eax][ebx] * b[ebx][edx] ; += [matrix_a + (eax * n + ebx) * 4] * [matrix_b + (ebx * m + edx) * 4] ;edi = a[eax][ebx] push edi push esi mov edi, eax imul edi, [n] add edi, ebx mov edi, [matrix_a + edi * 4] ;esi = b[ebx][edx] mov esi, ebx imul esi, [m] add esi, edx mov esi, [matrix_b + esi * 4] ;edi = a[eax][ebx] * b[ebx][edx] imul edi, esi add ecx, edi inc [cnt] mov edi, [cnt] cmp edi, [m] pop esi pop edi jne .sum jmp .next .prep_print_matrix_c: mov edi, matrix_с ;edi - указатель на матрицу mov esi, 0 ;esi - элемент матрицы mov ebx, [m] imul ebx, [k] ;ebx - всего элементов в матрице ;[cnt] - счетчик столбцов .print_matrix_c: cmp esi, ebx je .end mov eax, [edi] call io_print_dec inc [cnt] mov eax, [cnt] cmp eax, [n] jne .print_prob mov [n], 0 mov eax, 10 call io_print_char jmp .print_matrix_c .print_prob mov eax, 32 call io_print_char mov [edi], ecx add edi, 4 inc esi jmp .print_matrix_c .end: xor eax, eax ret
1) Этот код умножает две матрицы (A размером n×m и B размером m×k), сохраняет результат в матрицу C (n×k) и выводит её. Сначала считываются размеры и элементы матриц, затем вычисляется произведение, после чего результат построчно печатается с пробелами и переводами строк.

2) Подсказки:
- В метке `.prep_print_matrix_c` есть опечатка: `matrix_с` (кириллическая 'с') вместо `matrix_c` (латинская 'c'). Это вызовет ошибку линковки.
- В блоке `.print_prob` некорректно используется `mov [edi], ecx` — это портит данные матрицы C при печати. Нужно убрать эту строку, так как печать не должна изменять матрицу.