ХАНДЫФАР

Программа которая подсчитывает количество слов в заданной строке.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____string db _"I've got many friends in "
  6. ___________db _"China$"
  7. ____strlen equ ($-string)
  8. ____output db _"Number of words: $"
  9. ____count _dw _0
  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. ________xor_____si, si
  17. ________mov ____cx, strlen
  18. ________lea ____bx, ds:[string]
  19. ____MainLoop:
  20. ________cmp ____byte ptr[bx+si-1], 20h
  21. ________jne ____Skip
  22. ________inc ____count
  23. ____Skip:
  24. ________inc ____si
  25. ________loop ___MainLoop
  26. ________inc ____count
  27. ________mov ____ah, 09h
  28. ________lea ____dx, ds:[output]
  29. ________int ____21h
  30. ________mov ____dx, count
  31. ________call ___PrintNumber
  32. ________mov ____ax, 4C00h
  33. ________int ____21h
  34. ____main endp
  35. ____PrintNumber proc
  36. ________mov ____ax, dx
  37. ________mov ____bx, 10
  38. ________cwd
  39. ________div ____bx
  40. ________mov ____cl, 8
  41. ________shl ____ax, cl
  42. ________xchg ___al, dl
  43. ________or _____ax, 3030h
  44. ________xchg ___ax, bx
  45. ________mov ____ah, 02h
  46. ________cmp ____bh, 30h
  47. ________je _____PrintOneDigit
  48. ________mov ____dl, bh
  49. ________int ____21h
  50. ____PrintOneDigit:
  51. ________mov ____dl, bl
  52. ________int ____21h
  53. ________ret
  54. ____PrintNumber endp
  55. code ends
  56. end main
Программа которая подсчитывает количество слов в заданной строке.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____string db _"I've got many friends in China$" ; У меня много друзей в Китае
  6. ____strlen equ ($-string) _______________________; Вычисляем длину массива string
  7. ____output db _"Number of words: $" _____________; Число слов:
  8. ____count _dw _0
  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. ________xor_____si, si__________________; Обнуляем регистр-счётчик si
  16. ________mov ____cx, strlen______________; Копируем значение переменной strlen в регистр cx
  17. ________lea ____bx, ds:[string]_________; Загружаем адрес переменной string в регистр ds:bx
  18. ____MainLoop:
  19. ________cmp ____byte ptr[bx+si-1], 20h__; Сравниваем значение в bx под индексом si-1 с пробелом
  20. ________jne ____Skip____________________; Если ZF=0, то прыгаем на метку Skip
  21. ________inc ____count___________________; Увеличиваем значение переменной count на 1
  22. ____Skip:
  23. ________inc ____si______________________; Увеличиваем значение индекса si на 1
  24. ________loop ___MainLoop________________; Выполняем цикл пока CX≠0
  25. ________inc ____count___________________; Увеличиваем значение count на 1. Учитываем последнее слово
  26. ________mov ____ah, 09h_________________; Копируем значение функции вывода строки в регистр ah
  27. ________lea ____dx, ds:[output]_________; Загружаем адрес переменной output в регистр ds:dx
  28. ________int ____21h_____________________; Вызываем прерывание
  29. ________mov ____dx, count_______________; Копируем значение переменной result в регистр dx
  30. ________call ___PrintNumber_____________; Вызываем процедуру PrintNumber
  31. ________mov ____ax, 4C00h_______________; Копируем значение функции завершения в ah а значение в al
  32. ________int ____21h_____________________; Вызываем прерывание
  33. ____main endp __________________________; Конец процедуры main
  34. ____PrintNumber proc
  35. ________mov ____ax, dx__________________; Копируем значение регистра dx в регистр ax
  36. ________mov ____bx, 10__________________; Копируем число 10 в регистр bx
  37. ________cwd_____________________________; Выполняем знаковое расширение регистра dx
  38. ________div ____bx______________________; Выполняем деление значения в регистре ax на bx (10)
  39. ________mov ____cl, 8___________________; Копируем число 8 в регистр cl
  40. ________shl ____ax, cl__________________; Выполняем логический сдвиг влево на количество в регистре cl
  41. ________xchg ___al, dl__________________; Выполняем обмен содержимого регистров al и dl
  42. ________or _____ax, 3030h_______________; Выполняем логическое ИЛИ над ax с 3030
  43. ________xchg ___ax, bx__________________; Выполняем обмен содержимого регистров ax и bx
  44. ________mov ____ah, 02h_________________; Копируем значение функции вывода на консоль в регистр ah
  45. ________cmp ____bh, 30h_________________; Сравниваем значение в регистре bh c 30h
  46. ________je _____PrintOneDigit___________; Если ZF=1, то прыгаем на метку PrintOneDigit
  47. ________mov ____dl, bh__________________; Копируем значение регистра bh в регистр dl
  48. ________int ____21h_____________________; Вызываем прерывание
  49. ____PrintOneDigit:
  50. ________mov ____dl, bl__________________; Копируем значение регистра bl в регистр dl
  51. ________int ____21h_____________________; Вызываем прерывание
  52. ________ret_____________________________; Возврат из процедуры
  53. ____PrintNumber endp
  54. code ends ______________________________; Конец сегмента кода
  55. end main _______________________________; Конец файла. Точкой входа указывается процедура main



















8E D8

33 F6
B9 001F
8D 36 0000


80 78 FF 20__
75 04

FF 06 0031


46
E2 F3

FF 06 0031

B4 09
8D 16 001F
CD 21

8B 16 0031


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
Made on
Tilda