Онлайн компилятор Nasm

global _start section .bss strA resb 255 section .data msgNot db "String is Wrong", 0xA,0x0 msgOk db "String is Good", 0xA,0x0 section .text _start: mov eax,3 mov ebx,0 mov ecx,strA mov edx,255 int 0x80 xor ebx,ebx mov edx,strA doCheck: mov bl, [edx] inc edx cmp bl, '0' jb nextStep cmp bl, '9' ja nextStep jmp doCheck nextStep: cmp ebx ,0xA je printOk mov eax,4 mov ebx,1 mov ecx, msgNot mov edx,15 int 0x80 jmp exit printOk: mov eax,4 mov ebx,1 mov ecx, msgOk mov edx,14 int 0x80 xor ebx, ebx exit: mov eax, 1 mov ebx, 0 int 0x80
Программа читает строку с клавиатуры и пытается проверить, что все символы — цифры. Если встречается символ вне диапазона '0'..'9', она переходит к выводу "String is Wrong", иначе — "String is Good".

- Обратите внимание на регистр ebx: в начале цикла вы его обнуляете, но затем используете bl как временное хранилище для текущего символа. Из-за этого значение ebx перестаёт быть нулём, и сравнение `cmp ebx, 0xA` уже не проверяет конец строки — подумайте, какой регистр логичнее использовать для хранения текущего символа, а какой оставить для проверки перевода строки.
- Проверьте, что происходит, когда строка заканчивается: цикл `doCheck` не останавливается на символе 0xA или 0x0, а продолжает читать память дальше. Подумайте, где в цикле нужно проверять конец строки, чтобы не уйти за её пределы.