在线编译器 Nasm

global _start section .bss strA resb 255 section .data msgNot db "String is Wrong" msgOk db "String is Good" 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] ; символ в bl inc edx ; указатель на следующий символ cmp bl, 0x0 ; проверка на пустоту ячейки (если вышли из написаной строки и не было неправильных сисволов то заканчивает работу) je printOk cmp bl, '0' jb mstk cmp bl, '9' ja mstk jmp doCheck mstk: cmp bl, ' ' je prbl cmp bl, ',' je zpt cmp bl, '-' je numAfMP cmp bl, '+' je numAfMP jmp printNOT prbl: mov bl, [edx] inc edx cmp bl, ' ' je LastPrbl cmp bl, '-' je prblAndPrblORminusORplus cmp bl, '+' je prblAndPrblORminusORplus cmp bl, ',' je zpt jmp numAfprbll numAfMP: mov bl, [edx] inc edx numAfprbll: cmp bl, '0' jae prblNum jmp printNOT prblNum: cmp bl, '9' ja printNOT jmp doCheck prblAndPrblORminusORplus: mov bl, [edx] inc edx cmp bl, '0' jb printNOT cmp bl, '9' ja printNOT jmp doCheck zpt: mov bl, [edx] inc edx cmp bl, '-' je numAfMP cmp bl, '+' je numAfMP cmp bl, ' ' je LastPrbl jmp numAfprbll LastPrbl: mov bl, [edx] inc edx cmp bl, '-' je numAfMP cmp bl, '+' je numAfMP jmp numAfprbll printNOT: 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 exit: mov eax, 1 xor ebx, ebx ;может ошибка, чтоб выйти нужно убрать маркер ошибки int 0x80
Программа читает строку с клавиатуры и пытается проверить, является ли она корректной последовательностью чисел, разделённых пробелами, запятыми и знаками. Логика построена на ручном конечном автомате: указатель edx двигается по строке, а регистр bl хранит текущий символ.

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

- В метках prbl, zpt, LastPrbl и numAfMP вы читаете следующий символ и сразу переходите к проверкам, но не везде проверяете, что этот символ вообще существует (не конец строки). Также в numAfprbll сравнение `cmp bl, '0'` с `jae` пропускает символы меньше '0' как ошибку, но не проверяет верхнюю границу до перехода — проследите, что произойдёт, если после знака сразу идёт конец строки.