Online Compiler Nasm

section .data fmt_d db "%d", 0 fmt_out db "%d", 0 fmt_sp db " ", 0 fmt_nl db 10, 0 section .bss n_mat resd 1 max_sz resd 1 max_ptr resd 1 max_tr_l resd 1 max_tr_h resd 1 cur_sz resd 1 cur_ptr resd 1 is_first resd 1 section .text global main main: push ebp mov ebp, esp push ebx push esi push edi and esp, -16 sub esp, 32 lea eax, [ebp-4] mov [esp+4], eax mov dword [esp], fmt_d call scanf mov eax, [ebp-4] mov [n_mat], eax mov dword [is_first], 1 mov dword [max_ptr], 0 .m_loop: mov eax, [n_mat] test eax, eax jle .print_res dec dword [n_mat] lea eax, [ebp-8] mov [esp+4], eax mov dword [esp], fmt_d call scanf mov eax, [ebp-8] mov [cur_sz], eax mov ebx, eax imul ebx, eax mov eax, ebx shl eax, 2 mov [esp], eax call malloc mov [cur_ptr], eax xor esi, esi .f_data: cmp esi, ebx jge .c_tr lea eax, [ebp-12] mov [esp+4], eax mov dword [esp], fmt_d call scanf mov eax, [ebp-12] mov edx, [cur_ptr] mov [edx+esi*4], eax inc esi jmp .f_data .c_tr: xor ebx, ebx xor ecx, ecx mov edx, [cur_sz] test edx, edx jz .cmp_max mov edi, [cur_ptr] mov esi, [cur_sz] mov eax, [cur_sz] inc eax shl eax, 2 mov [ebp-16], eax .t_loop: mov eax, [edi] cdq add ebx, eax adc ecx, edx add edi, [ebp-16] dec esi jnz .t_loop .cmp_max: cmp dword [is_first], 1 je .upd mov eax, ebx sub eax, [max_tr_l] mov edx, ecx sbb edx, [max_tr_h] jl .dsc .upd: mov dword [is_first], 0 mov eax, [max_ptr] test eax, eax jz .sk_f mov [esp], eax call free .sk_f: mov [max_tr_l], ebx mov [max_tr_h], ecx mov eax, [cur_ptr] mov [max_ptr], eax mov eax, [cur_sz] mov [max_sz], eax jmp .m_loop .dsc: mov eax, [cur_ptr] mov [esp], eax call free jmp .m_loop .print_res: mov eax, [max_ptr] test eax, eax jz .quit xor esi, esi .o_r: cmp esi, [max_sz] jge .done xor edi, edi .o_c: mov eax, esi imul eax, [max_sz] add eax, edi mov edx, [max_ptr] mov eax, [edx+eax*4] mov [esp+4], eax mov dword [esp], fmt_out call printf inc edi cmp edi, [max_sz] jge .r_e mov dword [esp], fmt_sp call printf jmp .o_c .r_e: mov dword [esp], fmt_nl call printf inc esi jmp .o_r .done: mov eax, [max_ptr] mov [esp], eax call free .quit: lea esp, [ebp-12] pop edi pop esi pop ebx pop ebp ret
Этот код на NASM32 выполняет следующее:

1) Считывает количество квадратных матриц `n_mat`.  
2) Для каждой матрицы считывает её размер, выделяет память, заполняет её числами, вычисляет сумму элементов на главной диагонали (след матрицы).  
3) Сравнивает следы матриц и запоминает матрицу с максимальным следом (если след отрицательный — пропускает).  
4) В конце выводит матрицу с максимальным следом (поэлементно, с пробелами и переводами строк).  
5) Освобождает память.

**Конкретные подсказки для студента:**

1. **Обратите внимание на вычисление следа:** в цикле `.t_loop` используется `add edi, [ebp-16]`, где `[ebp-16] = (cur_sz + 1) * 4`. Это неверно для доступа к диагональным элементам — нужно прибавлять `(cur_sz + 1) * 4` байт, а не `(cur_sz + 1) * 4`. Фактически, `[ebp-16]` хранит смещение в байтах, но в коде оно используется как смещение в байтах, что правильно, но проверьте, что `cur_sz` — это размер матрицы (число строк/столбцов), и для перехода к следующему диагональному элементу нужно прибавить `(cur_sz + 1) * 4` байт.

2. **Проверьте логику сравнения следов:** в блоке `.cmp_max` сравниваются только младшие 32 бита суммы (`ebx`), а старшие (`ecx`) игнорируются при проверке `jl`. Для корректного сравнения 64-битных чисел нужно использовать `cmp ecx, [max_tr_h]` перед сравнением младших частей.