ХАНДЫФАР

Программа, которая вычисляем длину строки. Организуем цикл в котором будем проверять каждый символ на символ завершения строки 24h ($).

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____string db "When I was a little boy, "
  6. ___________db "I had a dream where I was "
  7. ___________db "looking for my father "
  8. ___________db "among huge pink flowers.$"
  9. ____output db "Length of the string: $"
  10. data ends
  11. code segment public
  12. ____assume ds:data, cs:code
  13. ____main proc
  14. ________mov ____ax, seg data
  15. ________mov ____ds, ax
  16. ________mov ____es, ax
  17. ________mov ____cx, 0FFFFh
  18. ________mov ____al, 24h
  19. ________lea ____di, es:[string]
  20. __repnz scasb
  21. ________not ____cx
  22. ________dec ____cx
  23. ________mov ____ah, 09h
  24. ________lea ____dx, ds:[output]
  25. ________int ____21h
  26. ________mov ____dx, cx
  27. ________call ___PrintNumber
  28. ________mov ____ax, 4C00h
  29. ________int ____21h
  30. ____main endp
  31. ____PrintNumber proc
  32. ________mov ____ax, dx
  33. ________mov ____bx, 10
  34. ________cwd
  35. ________div ____bx
  36. ________mov ____cl, 8
  37. ________shl ____ax, cl
  38. ________xchg ___al, dl
  39. ________or _____ax, 3030h
  40. ________xchg ___ax, bx
  41. ________mov ____ah, 02h
  42. ________cmp ____bh, 30h
  43. ________je _____PrintOneDigit
  44. ________mov ____dl, bh
  45. ________int ____21h
  46. ____PrintOneDigit:
  47. ________mov ____dl, bl
  48. ________int ____21h
  49. ________ret
  50. ____PrintNumber endp
  51. code ends
  52. end main



















8E D8
8E C0

B9 FFFF
B0 24
8D 3E 0000

F2 AE

F7 D1
49

B4 09
8D 16 0062__
CD 21

8B D1


B8 4C00
CD 21



8B C2
BB 000A
99
F7 F3

B1 08
D3 E0
86 C2
0D 3030
93

B4 02
80 FF 30
74 04

8A D7
CD 21


8A D3
CD 21
C3
Программа, которая вычисляем длину строки. Организуем цикл в котором будем проверять каждый символ на символ завершения строки 24h ($).

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____string db "When I was a little boy, I had a dream where I was looking for my father among huge "
  6. ___________db "pink flowers.$"
  7. ____output db "Length of the string: $" ; Длина строки:
  8. data ends
  9. code segment public _____________; Начало сегмента кода
  10. ____assume ds:data, cs:code
  11. ____main proc ___________________; Начало процедуры main
  12. ________mov ____ax, seg data_____; Получаем адрес сегмента памяти данных и сохраняем его в ax
  13. ________mov ____ds, ax___________; Передаём адрес сегмента памяти данных из регистра ax в ds
  14. ________mov ____es, ax___________; Передаём адрес сегмента памяти данных из регистра ax в es
  15. ________mov ____cx, 0FFFFh_______; Копируем число -1 в регистр cx
  16. ________mov ____al, 24h__________; Копируем значение для поиска ('$') в регистр al
  17. ________lea ____di, es:[string]__; Загружаем адрес переменной string в регистр es:di
  18. __repnz scasb____________________; Выполняем поиск символа '$' в es:di пока флаг ZF≠1
  19. ________not ____cx_______________; Переворачиваем все биты в регистре cx
  20. ________dec ____cx_______________; Уменьшаем значение на 1
  21. ________mov ____ah, 09h__________; Копируем значение функции вывода строки в регистр ah
  22. ________lea ____dx, ds:[output]__; Загружаем адрес переменной output в регистр ds:dx
  23. ________int ____21h______________; Вызываем прерывание
  24. ________mov ____dx, cx___________; Копируем значение регистра cx в регистр dx
  25. ________call ___PrintNumber______; Вызываем процедуру PrintNumber
  26. ________mov ____ax, 4C00h________; Копируем значение функции завершения в ah а значение в al
  27. ________int ____21h______________; Вызываем прерывание
  28. ____main endp ___________________; Конец процедуры main
  29. ____PrintNumber proc
  30. ________mov ____ax, dx___________; Копируем значение регистра dx в регистр ax
  31. ________mov ____bx, 10___________; Копируем число 10 в регистр bx
  32. ________cwd______________________; Выполняем знаковое расширение регистра dx
  33. ________div ____bx_______________; Выполняем деление значения в регистре ax на bx (10)
  34. ________mov ____cl, 8____________; Копируем число 8 в регистр cl
  35. ________shl ____ax, cl___________; Выполняем логический сдвиг влево на количество в регистре cl
  36. ________xchg ___al, dl___________; Выполняем обмен содержимого регистров al и dl
  37. ________or _____ax, 3030h________; Выполняем логическое ИЛИ над ax с 3030
  38. ________xchg ___ax, bx___________; Выполняем обмен содержимого регистров ax и bx
  39. ________mov ____ah, 02h__________; Копируем значение функции вывода на консоль в регистр ah
  40. ________cmp ____bh, 30h__________; Сравниваем значение в регистре bh c 30h
  41. ________je _____PrintOneDigit____; Если ZF=1, то прыгаем на метку PrintOneDigit
  42. ________mov ____dl, bh___________; Копируем значение регистра bh в регистр dl
  43. ________int ____21h______________; Вызываем прерывание
  44. ____PrintOneDigit:
  45. ________mov ____dl, bl___________; Копируем значение регистра bl в регистр dl
  46. ________int ____21h______________; Вызываем прерывание
  47. ________ret______________________; Возврат из процедуры
  48. ____PrintNumber endp
  49. code ends _______________________; Конец сегмента кода
  50. end main ________________________; Конец файла. Точкой входа указывается процедура main
Made on
Tilda