ХАНДЫФАР

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

  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_____________________; Вызываем прерывание DOS
  29. ________mov ____dx, count_______________; Копируем значение переменной result в регистр dx
  30. ________call ___PrintNumber_____________; Вызываем процедуру PrintNumber
  31. ________mov ____ax, 4C00h_______________; Копируем значение функции завершения в ah а значение в al
  32. ________int ____21h_____________________; Вызываем прерывание DOS
  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_________________; Сравниваем значение в регистре ch c 30h
  46. ________je _____PrintOneDigit___________; Если ZF=1, то прыгаем на метку PrintOneDigit
  47. ________mov ____dl, bh__________________; Копируем значение регистра ch в регистр dl
  48. ________int ____21h_____________________; Вызываем прерывание DOS
  49. ____PrintOneDigit:
  50. ________mov ____dl, bl__________________; Копируем значение регистра cl в регистр dl
  51. ________int ____21h_____________________; Вызываем прерывание DOS
  52. ________ret_____________________________; Возврат из процедуры
  53. ____PrintNumber endp
  54. code ends ______________________________; Конец сегмента кода
  55. end main _______________________________; Конец файла. Точкой входа указывается процедура main
Made on
Tilda