Online Compiler Nasm

extern scanf, printf section .rodata type db "%d", 0 section .bss x resd 1 ans resd 1 section .text global main main: push esp mov ebp, esp and esp, 16 .Loop: sub esp, 8 push x push type call scanf add esp, 16 cmp eax, 0 je .Fin add dword [ans], 1 jmp .Loop .Fin: sub esp, 8 push dword [ans] push type call printf add esp, 16 xor eax, eax ret
Этот код на NASM32 считывает числа через scanf, пока не будет введено нечисловое значение или не наступит конец ввода, и подсчитывает количество успешно прочитанных чисел. После завершения цикла выводит это количество.

- В начале main вы сохраняете старое значение esp в ebp и выравниваете стек по 16 байт, но затем в цикле вы используете sub esp, 8 перед вызовом scanf, что может нарушить выравнивание стека, требуемое для вызова функций. Проверьте, сколько байт вы добавляете в стек перед вызовом scanf и printf, и соответствует ли это правилам выравнивания.

- После вызова scanf вы сравниваете eax с 0, чтобы проверить, успешно ли прочитано число. Но scanf возвращает количество успешно прочитанных элементов, а не 0 при ошибке. Подумайте, как правильно обработать случай, когда ввод не является числом.