ХАНДЫФАР

Функция StringEndsWith проверяет, заканчивается ли первая строка с заданной второй подстроки.

Параметры:

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

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

  • ZF = 1: Если первая строка заканчивается с заданной подстроки.
  • ZF = 0: Если первая строка не заканчивается с заданной подстроки.

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

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

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

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

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____string____db "Евгений Довгополов\0"
  6. ____mName_____db "полв\0"
  7. ____true_msg _db "Строка '%s' "
  8. ______________db заканчивается на '%s'\0"
  9. ____false_msg db "Строка '%s' не "
  10. ______________db "заканчивается на '%s'\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_____bx, es:[mName]
  18. ________lea_____ax, ds:[string]
  19. ________call____StringEndsWith
  20. ________jnz_____False
  21. ____True:
  22. ________lea_____ax, es:[mName]
  23. ________push____ax
  24. ________lea_____ax, ds:[string]
  25. ________push____ax
  26. ________lea_____ax, ds:[true_msg]
  27. ________jmp_____Done_
  28. ____False:
  29. ________lea_____ax, es:[mName]
  30. ________push____ax
  31. ________lea_____ax, ds:[string]
  32. ________push____ax
  33. ________lea_____ax, ds:[false_msg]
  34. ____Done:
  35. ________call____PrintFormatString
  36. ________add_____sp, 4
  37. ________xor_____al, al
  38. ________call____ExitProcess
  39. ____main endp
  40. code ends
  41. end main
Функция StringEndsWith проверяет, заканчивается ли первая строка с заданной второй подстроки.

Параметры:

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

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

  • ZF = 1: Если первая строка заканчивается с заданной подстроки.
  • ZF = 0: Если первая строка не заканчивается с заданной подстроки.

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

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

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

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

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____string____db "Евгений Довгополов\0"
  6. ____mName_____db "полв\0"
  7. ____true_msg _db "Строка '%s' заканчивается на '%s'\0"
  8. ____false_msg db "Строка '%s' не заканчивается на '%s'\0"
  9. data ends
  10. code segment public ________________; Начало сегмента кода
  11. ____assume _ds:data, cs:code
  12. ____include Handyfar.inc____________; Подключаем файл с функциями
  13. ____main proc ______________________; Начало процедуры main
  14. ________call____SetDataSegment______; Вызываем процедуру SetDataSegment
  15. ________lea_____bx, es:[mName]______; Загружаем адрес переменной mName в регистр es:bx
  16. ________lea_____ax, ds:[string]_____; Загружаем адрес переменной string в регистр ds:ax
  17. ________call____StringEndsWith______; Вызываем процедуру StringEndsWith(ds:ax, es:bx)
  18. ________jnz_____False_______________; Если ZF=0, то прыгаем на метку False
  19. ____True:
  20. ________lea_____ax, es:[mName]______; Загружаем адрес переменной mName в регистр ds:ax
  21. ________push____ax__________________; 3-й: Сохраняем значение регистра ax в стеке
  22. ________lea_____ax, ds:[string]_____; Загружаем адрес переменной string в регистр ds:ax
  23. ________push____ax__________________; 2-й: Сохраняем значение регистра ax в стеке
  24. ________lea_____ax, ds:[true_msg]___; 1-й: Загружаем адрес строки формата true_msg в регистр ds:ax
  25. ________jmp_____Done________________; Выполняем безусловный переход на метку Done
  26. ____False:
  27. ________lea_____ax, es:[mName]______; Загружаем адрес переменной mName в регистр ds:ax
  28. ________push____ax__________________; 3-й: Сохраняем значение регистра ax в стеке
  29. ________lea_____ax, ds:[string]_____; Загружаем адрес переменной string в регистр ds:ax
  30. ________push____ax__________________; 2-й: Сохраняем значение регистра ax в стеке
  31. ________lea_____ax, ds:[false_msg]__; 1-й: Загружаем адрес строки формата false_msg в регистр ds:ax
  32. ____Done:
  33. ________call____PrintFormatString___; Вызываем процедуру PrintFormatString(ax)
  34. ________add_____sp, 4_______________; Выравниваем стек
  35. ________xor_____al, al______________; Обнуляем регистр al
  36. ________call____ExitProcess_________; Вызываем процедуру ExitProcess
  37. ____main endp ______________________; Конец процедуры main
  38. code ends __________________________; Конец сегмента кода
  39. end main ___________________________; Конец файла. Точкой входа указывается процедура main
Made on
Tilda