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: add esp, ~15 push b push a push scan_format sub esp, 4 call scanf mov eax, [a] mov ecx, [b] add esp, 12 add eax, eax push eax push print_format call printf add esp, 8 xor eax, eax ret
Этот код считывает два целых числа, складывает их и выводит результат. Однако в нём есть несколько ошибок.

- Вы используете `add esp, ~15` в начале main, но это неверный способ выравнивания стека. Для выравнивания по 16 байт нужно вычесть из esp, а не прибавить.
- После вызова scanf вы прибавляете 12 к esp, но перед scanf вы выделили 4 байта и положили 12 байт аргументов — итого 16. Нужно вернуть ровно столько, сколько выделили.
- Инструкция `add eax, eax` удваивает значение eax, а не складывает a и b. Для сложения нужно использовать `add eax, ecx`.