Online Compiler Nasm

extern scanf, printf section .rodata print_format db `%d`, 10, 0 scan_format db `%d %d`, 0 section .bss a resd 1 b resd 1 section .text global main main: and esp, ~15 sub esp, 4 push b push a push scan_format call scanf add esp, 16 mov eax, [a] mov ecx, [b] add eax, ecx sub esp, 8 push eax push print_format call printf add esp, 16 xor eax, eax ret
Этот код считывает два целых числа, складывает их и выводит результат. Основная логика верна, но есть проблема с выравниванием стека при вызове scanf.

- После `and esp, ~15` стек выровнен по 16 байтам. Затем вы делаете `sub esp, 4` — это нарушает выравнивание. Для scanf нужно, чтобы стек был выровнен по 16 байтам перед вызовом, а вы передаёте три аргумента (12 байт) плюс адрес возврата — итого 16. Подумайте, как правильно подготовить стек, не сбивая выравнивание.

- После scanf вы добавляете 16 к esp, но перед этим стек был сдвинут на 4 байта. Проверьте, восстанавливаете ли вы стек в правильное состояние перед дальнейшими операциями.