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 cmp [cnt], [m] jne .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] * [matrix_b + ebx * m + edx] mov ebx, [matrix_a + eax * n + ebx] imul ebx, [matrix_b + ebx * m + edx] add ecx, ebx inc [cnt] jmp .next .prep_print_matrix_c: mov edi, matrix_b ;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 и B), умножает их, сохраняет результат в матрицу C и выводит её. Однако в нём есть логические ошибки и опечатки, из-за которых умножение и вывод не будут работать корректно.

2) Подсказки:
- В секции `.sum` ты используешь `n` и `m` как непосредственные значения, но это метки адресов. Для доступа к значениям размеров матриц нужны квадратные скобки: `[n]` и `[m]`. Также пересмотри расчёт индексов для доступа к элементам в памяти.
- В блоке `.print_prob` ты перезаписываешь значение в `[edi]` (которое должно быть элементом матрицы) регистром `ecx`, но `ecx` в этот момент не содержит нужного значения для вывода. Это нарушит вывод матрицы.