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

- После вызова scanf стек восстанавливается неправильно: вы добавили 16 байт, но перед вызовом было выделено только 4 байта через sub esp, 4, а также три push (каждый по 4 байта). Посчитайте общее смещение стека и убедитесь, что add esp, ... возвращает его в исходное положение перед вызовом scanf.

- После сложения eax и ecx результат помещается в eax, но затем вы снова используете eax для push перед printf. Убедитесь, что значение суммы не теряется.