После повторного scasb содержимое ECX изменилось с -1 на -4, вам нужно НЕ ECX, а затем DEC ECX, чтобы получить ECX = 2 (размер члена "15"). Затем выведите ECX-байты текста в ESI и повторите разделение: есть проблема: поскольку последний член "x" не заканчивается запятой, repne scasb завершится сбоем. Вы должны ограничить ECX общим размером входного текста до сканирования. Я попробовал этот вариант с EuroAssembler :
; Assembled on Ubuntu with
; wine euroasm.exe split.asm
; Linked with
; ld split.obj -o split -e Main -m elf_i386
; Run with
; ./split
EUROASM
split PROGRAM Format=COFF, Entry=Main:
INCLUDE linapi.htm,cpuext32.htm ; Library which defines StdInput,StdOutput.
[.text]
Main: StdOutput ="Enter comma-separated members: "
StdInput aString ; Read aString from console, return number of bytes in ECX.
MOV EDI,aString ; Pointer to the beginning of text.
LEA EBX,[EDI+ECX] ; Pointer to the end of text.
split: MOV ESI,EDI ; Position of the 1st byte.
MOV ECX,EBX
SUB ECX,EDI ; How many bytes is left in unparsed substring.
JNA fin:
MOV AL,','
REPNE SCASB
MOV ECX,EDI
DEC ECX ; Omit the delimiter.
SUB ECX,ESI
StdOutput ESI, Size=ECX, Eol=Yes
JMP split:
fin: TerminateProgram
[.bss]
aString DB 256 * BYTE
ENDPROGRAM split
И это хорошо сработало:
./split
Enter comma-separated members: 15,20,x
15
20
x