ХАНДЫФАР

Функция StringSplit разбивает строку на токены, используя разделители, и сохраняет их в подготовленном пользователем буфере. Если указатель на строку равен 0, функция завершает работу без изменений.

Параметры:

  • DS:AX: Указатель на строку, завершающуюся (\0) или 0.
  • ES:BX: Указатель на строку разделителей, завершающуюся (\0) или 0.
  • DS:CX: Указатель на подготовленный пользователем буфер для сохранения токенов.

Возвращаемое значение:

  • CX: Количество токенов, сохранённых в буфере. Если строка или буфер недействительны, возвращается 0.

Состояние флагов:

  • Функция не изменяет состояние флагов.

Особенности:

  • Токены сохраняются в подготовленном буфере, каждый токен завершается нулём 0.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____string db "Весенний ветер, лаская "
  6. ___________db "листву, шепчет тайны, "
  7. ___________db "даря аромат цветущих "
  8. ___________db "садов.\0"
  9. ____buffer db 80 dup(0)
  10. ____delims db " ,.\0"
  11. data ends
  12. code segment public
  13. ____assume _ds:data, cs:code
  14. ____include Handyfar.inc
  15. ____main proc
  16. ________call____SetDataSegment
  17. ________lea_____cx, ds:[buffer]
  18. ________lea_____bx, es:[delims]
  19. ________lea_____ax, ds:[string]
  20. ________call____StringSplit
  21. ________lea_____si, ds:[buffer]
  22. ____MainLoop:
  23. ________lodsb
  24. ________test____al, al
  25. ________jz______Skip
  26. ________call____PutChar
  27. ________jmp_____MainLoop
  28. ____Skip:
  29. ________call____PrintNewLine
  30. ________loop____MainLoop
  31. ________xor_____al, al
  32. ________call____ExitProcess
  33. ____main endp
  34. code ends
  35. end main
Функция StringSplit разбивает строку на токены, используя разделители, и сохраняет их в подготовленном пользователем буфере. Если указатель на строку равен 0, функция завершает работу без изменений.

Параметры:

  • DS:AX: Указатель на строку, завершающуюся (\0) или 0.
  • ES:BX: Указатель на строку разделителей, завершающуюся (\0) или 0.
  • DS:CX: Указатель на подготовленный пользователем буфер для сохранения токенов.

Возвращаемое значение:

  • CX: Количество токенов, сохранённых в буфере. Если строка или буфер недействительны, ____возвращается 0.

Состояние флагов:

  • Функция не изменяет состояние флагов.

Особенности:

  • Токены сохраняются в подготовленном буфере, каждый токен завершается нулём 0.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____string db "Весенний ветер, лаская листву, шепчет тайны, даря аромат цветущих садов.\0"
  6. ____buffer db 80 dup(0)
  7. ____delims db " ,.\0"
  8. data ends
  9. code segment public _____________; Начало сегмента кода
  10. ____assume _ds:data, cs:code
  11. ____include Handyfar.inc_________; Подключаем файл с функциями
  12. ____main proc ___________________; Начало процедуры main
  13. ________call____SetDataSegment___; Вызываем процедуру SetDataSegment
  14. ________lea_____cx, ds:[buffer]__; Загружаем адрес переменной buffer в регистр ds:cx
  15. ________lea_____bx, es:[delims]__; Загружаем адрес переменной delims в регистр es:bx
  16. ________lea_____ax, ds:[string]__; Загружаем адрес переменной string в регистр ds:ax
  17. ________call____StringSplit______; Вызываем процедуру StringSplit(ds:ax, es:bx, ds:cx) := CX
  18. ________lea_____si, ds:[buffer]__; Загружаем адрес переменной buffer в регистр ds:si
  19. ____MainLoop:
  20. ________lodsb____________________; Загружаем байт из регистра-источника si в регистр al
  21. ________test____al, al___________; Выполняем логическое сравнение значения в регистре al с 0
  22. ________jz______Skip_____________; Если ZF=1, то прыгаем на метку Skip
  23. ________call____PutChar__________; Вызываем процедуру PutChar(al)
  24. ________jmp_____MainLoop_________; Выполняем безусловный переход на метку MainLoop
  25. ____Skip:
  26. ________call____PrintNewLine_____; Вызываем процедуру PrintNewLine
  27. ________loop____MainLoop_________; Выполняем цикл пока CX≠0
  28. ________xor_____al, al___________; Обнуляем регистр al
  29. ________call____ExitProcess______; Вызываем процедуру ExitProcess
  30. ____main endp ___________________; Конец процедуры main
  31. code ends _______________________; Конец сегмента кода
  32. end main ________________________; Конец файла. Точкой входа указывается процедура main
Made on
Tilda