Online Compiler Nasm

extern scanf extern printf extern malloc extern free section .data fd db "%d", 0 fout db "%d", 0 fc db "%c", 0 section .bss n resd 1 d resd 1 val resd 1 cur resd 1 best resd 1 bestn resd 1 i resd 1 j resd 1 t resd 1 slo resd 1 shi resd 1 blo resd 1 bhi resd 1 section .text global main main: push ebp mov ebp, esp push ebx push esi push edi and esp, -16 mov dword [best], 0 mov dword [bestn], 0 mov dword [blo], 0 mov dword [bhi], 80000000h sub esp, 8 push n push fd call scanf add esp, 16 x1: cmp dword [n], 0 je print sub esp, 8 push d push fd call scanf add esp, 16 mov eax, [d] imul eax, [d] shl eax, 2 sub esp, 12 push eax call malloc add esp, 16 mov [cur], eax mov dword [slo], 0 mov dword [shi], 0 mov dword [i], 0 x2: mov eax, [i] cmp eax, [d] jge x8 mov dword [j], 0 x3: mov eax, [j] cmp eax, [d] jge x7 sub esp, 8 push val push fd call scanf add esp, 16 mov eax, [i] imul eax, [d] add eax, [j] mov [t], eax mov ebx, [cur] mov ecx, [t] mov eax, [val] mov [ebx + ecx * 4], eax mov eax, [i] cmp eax, [j] jne x6 mov eax, [val] cdq add [slo], eax adc [shi], edx x6: inc dword [j] jmp x3 x7: inc dword [i] jmp x2 x8: mov eax, [shi] cmp eax, [bhi] jg x9 jl x10 mov eax, [slo] cmp eax, [blo] jbe x10 x9: cmp dword [best], 0 je x11 sub esp, 12 push dword [best] call free add esp, 16 x11: mov eax, [cur] mov [best], eax mov eax, [d] mov [bestn], eax mov eax, [slo] mov [blo], eax mov eax, [shi] mov [bhi], eax jmp x12 x10: sub esp, 12 push dword [cur] call free add esp, 16 x12: dec dword [n] jmp x1 print: mov dword [i], 0 x13: mov eax, [i] cmp eax, [bestn] jge end mov dword [j], 0 x14: mov eax, [j] cmp eax, [bestn] jge x17 cmp dword [j], 0 je x15 sub esp, 8 push 32 push fc call printf add esp, 16 x15: mov eax, [i] imul eax, [bestn] add eax, [j] mov ebx, [best] push dword [ebx + eax * 4] push fout call printf add esp, 8 inc dword [j] jmp x14 x17: sub esp, 8 push 10 push fc call printf add esp, 16 inc dword [i] jmp x13 end: cmp dword [best], 0 je x18 sub esp, 12 push dword [best] call free add esp, 16 x18: lea esp, [ebp - 12] pop edi pop esi pop ebx mov esp, ebp pop ebp xor eax, eax ret
Этот код на NASM32 читает несколько квадратных матриц, находит среди них матрицу с максимальной суммой элементов на главной диагонали и выводит её. Программа сначала считывает количество матриц n, затем для каждой матрицы считывает её размер d, выделяет память, заполняет матрицу, вычисляет сумму диагонали (64-битное число в slo:shi) и сравнивает с текущим лучшим результатом (blo:bhi). Если текущая сумма больше, то предыдущая лучшая матрица освобождается, а текущая становится новой лучшей. В конце выводится лучшая матрица.

- В коде есть потенциальная проблема с выравниванием стека при вызовах функций. После `and esp, -16` стек выровнен, но затем при каждом вызове scanf, printf, malloc, free используется `sub esp, 8` или `sub esp, 12` перед push аргументов. Это может нарушить выравнивание стека, так как общее количество push должно быть таким, чтобы стек оставался выровненным по 16 байтам. Проверьте, что перед каждым вызовом стек выровнен правильно.

- При вычислении суммы диагонали используется `cdq` для расширения знака eax в edx:eax, но затем результат добавляется к 64-битному числу slo:shi. Если val может быть отрицательным, то `cdq` корректен, но если val всегда неотрицательный, то `cdq` может дать неверный результат для больших чисел (например, если val > 2^31-1). Убедитесь, что тип данных val соответствует ожидаемому диапазону.