Разделить строку в сборке - PullRequest
0 голосов
/ 01 мая 2019

Я использую код для разделения строки с разделителем, но это спасает меня от "правой стороны", и мне нужна "левая сторона" слова.

Например, если вводэто 15,20,x, тогда выходные данные должны быть:

15
20
x

Но это показывает мне:

15,20,x
20,x
x

Это код, который я использую

split:
    mov     esi,edi
    mov     ecx, 0 
    not     ecx    
    mov     al, ','
    cld         
    repne     scasb
    not     ecx
    lea     eax, [ecx-1]

    ;push     eax
    mov     eax, edi
    call     println        ;Here is where I want to print the "left side"
    ;pop     eax

    xchg     esi, edi

    mov     eax, esi
    call     length

    mov     edi, esi
    mov     ecx, eax
    cmp     ecx, 1
    je         fin
    jg         split
    ret
fin:
    ret

1 Ответ

0 голосов
/ 01 мая 2019

После повторного 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
...