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 при ошибке. Подумайте, как правильно обработать случай, когда ввод не является числом.