ХАНДЫФАР

Программа, которая проверяет, является ли строка строкой заголовком.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____string ___db _"The Quick Brown Fox$"
  6. ____strlen ___equ ($-string)
  7. ____msg_true _db _"True$"
  8. ____msg_false db _"False$"
  9. data ends
  10. code segment public
  11. ____assume ds:data, cs:code
  12. ____main proc
  13. ________mov ____ax, seg data
  14. ________mov ____ds, ax
  15. ________mov ____cx, strlen
  16. ________lea ____si, ds:[string]
  17. ________call ___CheckString
  18. ________jnz ____FalseMessage
  19. ________lea ____dx, ds:[msg_true]
  20. ________jmp ____Done
  21. ____FalseMessage:
  22. ________lea ____dx, ds:[msg_false]
  23. ____Done:
  24. ________mov ____ah, 09h
  25. ________int ____21h
  26. ________mov ____ax, 4C00h
  27. ________int ____21h
  28. ____main endp
  29. ____CheckString proc
  30. ________push ___ax
  31. ________push ___si
  32. ________mov ____al, 1
  33. ________jmp ____CheckFirstLetter
  34. ____CheckLoop:
  35. ________cmp ____byte ptr[si-1], 20h
  36. ________jne ____Skip
  37. ____CheckFirstLetter:
  38. ________cmp ____byte ptr[si], 41h
  39. ________jb _____False
  40. ________cmp ____byte ptr[si], 5Ah
  41. ________ja _____False
  42. ________xor ____al, al
  43. ____Skip:
  44. ________inc ____si
  45. ________loop ___CheckLoop
  46. ________test ___al, al
  47. ____False:
  48. ________pop ____si
  49. ________pop ____ax
  50. ________ret
  51. ____CheckString endp
  52. code ends
  53. end main
Программа, которая проверяет, является ли строка строкой заголовком.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____string ___db _"The Quick Brown Fox$"
  6. ____strlen ___equ ($-string)
  7. ____msg_true _db _"True$"
  8. ____msg_false db _"False$"
  9. data ends
  10. code segment public _________________; Начало сегмента кода
  11. ____assume ds:data, cs:code
  12. ____main proc _______________________; Начало процедуры main
  13. ________mov ____ax, seg data_________; Получаем адрес сегмента памяти данных и сохраняем его в ax
  14. ________mov ____ds, ax_______________; Передаём адрес сегмента памяти данных из регистра ax в ds
  15. ________mov ____cx, strlen___________; Копируем длину байтового массива string в регистр cx
  16. ________lea ____si, ds:[string]______; Загружаем адрес переменной string в регистр ds:si
  17. ________call ___CheckString__________; Вызываем процедуру CheckString
  18. ________jnz ____FalseMessage_________; Если ZF=0, то прыгаем на метку FalseMessage
  19. ________lea ____dx, ds:[msg_true]____; Загружаем адрес переменной msg_true в регистр ds:dx
  20. ________jmp ____Done_________________; Выполняем безусловный переход на метку Done
  21. ____FalseMessage:
  22. ________lea ____dx, ds:[msg_false]___; Загружаем адрес переменной msg_false в регистр ds:dx
  23. ____Done:
  24. ________mov ____ah, 09h______________; Копируем значение функции вывода строки в регистр ah
  25. ________int ____21h__________________; Вызываем прерывание
  26. ________mov ____ax, 4C00h____________; Копируем значение функции завершения в ah а значение в al
  27. ________int ____21h__________________; Вызываем прерывание
  28. ____main endp _______________________; Конец процедуры main
  29. ____CheckString proc_________________; Начало процедуры CheckString
  30. ________push ___ax___________________; Сохраняем значение регистра ax в стеке
  31. ________push ___si___________________; Сохраняем значение регистра si в стеке
  32. ________mov ____al, 1________________; Копируем значение 1 в регистр al (Если al=1, то False)
  33. ________jmp ____CheckFirstLetter_____; Выполняем безусловный переход на метку CheckFirstLetter
  34. ____CheckLoop:
  35. ________cmp ____byte ptr[si-1], 20h__; Сравниваем значение в si-1 с пробелом
  36. ________jne ____Skip_________________; Если ZF=0, то прыгаем на метку Skip
  37. ____CheckFirstLetter:
  38. ________cmp ____byte ptr[si], 41h____; Сравниваем значение в регистре si с 'A'
  39. ________jb _____False________________; Если значение в si ниже чем 'A', то прыгаем на метку False
  40. ________cmp ____byte ptr[si], 5Ah____; Сравниваем значение в регистре si с 'Z'
  41. ________ja _____False________________; Если значение в si выше чем 'Z', то прыгаем на метку False
  42. ________xor ____al, al_______________; Обнуляем значение регистра al (Если al=0, то True)
  43. ____Skip:
  44. ________inc ____si___________________; Увеличиваем индекс si на 1
  45. ________loop ___CheckLoop____________; Выполняем цикл пока регистр CX≠0
  46. ________test ___al, al_______________; Выполняем логическое сравнение регистра al с самим собой
  47. ____False:
  48. ________pop ____si___________________; Выталкиваем значение из стека в регистр si
  49. ________pop ____ax___________________; Выталкиваем значение из стека в регистр ax
  50. ________ret__________________________; Возврат из процедуры
  51. ____CheckString endp_________________; Конец процедуры CheckString
  52. code ends ___________________________; Конец сегмента кода
  53. end main ____________________________; Конец файла. Точкой входа указывается процедура main



















8E D8

B9 0013
8D 36 0000


75 07

8D 16 0013
EB 05 90


8D 16 0018


B4 09
CD 21

B8 4C00
CD 21



50
56

B0 01

EB 07 90


80 7C FF 20__
75 0C


80 3C 41
72 0C

80 3C 5A
77 07

32 C0


46
E2 EB

84 C0


5E
58
C3
Made on
Tilda