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 .prep_matrix_c 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 .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) Подсказки:
- Обрати внимание, что в метках `.read_matrix_a` и `.read_matrix_b` регистры `ecx` и `ebx` сохраняются в стеке, но восстанавливаются в неправильном порядке — это может привести к ошибкам.
- При вычислении индексов для доступа к элементам матриц в секции `.sum` убедись, что используемые формулы корректно учитывают размерности матриц (m и k).