ХАНДЫФАР

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

  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. ____number dw 0
  11. data ends
  12. code segment public
  13. ____assume ds:data, cs:code
  14. ____main proc
  15. ________mov ____ax, seg data
  16. ________mov ____ds, ax
  17. ________lea ____bx, ds:[string]
  18. ____MainLoop:
  19. ________cmp ____byte ptr[bx+si], 24h
  20. ________je _____Done
  21. ________inc ____number
  22. ________inc ____si
  23. ________jmp ____MainLoop
  24. ____Done:
  25. ________mov ____ah, 09h
  26. ________lea ____dx, ds:[output]
  27. ________int ____21h
  28. ________mov ____dx, number
  29. ________call ___PrintNumber
  30. ________mov ____ax, 4C00h
  31. ________int ____21h
  32. ____main endp
  33. ____PrintNumber proc
  34. ________mov ____ax, dx
  35. ________mov ____bx, 10
  36. ________cwd
  37. ________div ____bx
  38. ________mov ____cl, 8
  39. ________shl ____ax, cl
  40. ________xchg ___al, dl
  41. ________or _____ax, 3030h
  42. ________xchg ___ax, bx
  43. ________mov ____ah, 02h
  44. ________cmp ____bh, 30h
  45. ________je _____PrintOneDigit
  46. ________mov ____dl, bh
  47. ________int ____21h
  48. ____PrintOneDigit:
  49. ________mov ____dl, bl
  50. ________int ____21h
  51. ________ret
  52. ____PrintNumber endp
  53. code ends
  54. end main
Программа, которая вычисляем длину строки. Организуем цикл в котором будем проверять каждый символ на символ завершения строки 24h ($), каждый раз увеличивая значение переменной number на 1. Выходим из цикла как только встретим символ завершения строки.

  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. ____number 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. ________lea ____bx, ds:[string]_______; Загружаем адрес переменной string в регистр ds:bx
  16. ____MainLoop:
  17. ________cmp ____byte ptr[bx+si], 24h__; Сравниваем значение в регистре bx под индексом si c $
  18. ________je _____Done__________________; Если ZF=1, то прыгаем на метку Done
  19. ________inc ____number________________; Увеличиваем значение переменной number на 1
  20. ____________________
  21. ________inc ____si____________________; Увеличиваем значение индекса si на 1
  22. ________jmp ____MainLoop______________; Выполняем цикл пока BX+SI≠24h
  23. ____Done:
  24. ________mov ____ah, 09h_______________; Копируем значение функции вывода строки в регистр ah
  25. ________lea ____dx, ds:[output]_______; Загружаем адрес переменной output в регистр ds:dx
  26. ________int ____21h___________________; Вызываем прерывание DOS
  27. ________mov ____dx, number____________; Копируем значение переменной number в регистр dx
  28. ________call ___PrintNumber___________; Вызываем процедуру PrintNumber
  29. ________mov ____ax, 4C00h_____________; Копируем значение функции завершения в ah а значение в al
  30. ________int ____21h___________________; Вызываем прерывание DOS
  31. ____main endp ________________________; Конец процедуры main
  32. ____PrintNumber proc
  33. ________mov ____ax, dx________________; Копируем значение регистра dx в регистр ax
  34. ________mov ____bx, 10________________; Копируем число 10 в регистр bx
  35. ________cwd___________________________; Выполняем знаковое расширение регистра dx
  36. ________div ____bx____________________; Выполняем деление значения в регистре ax на bx (10)
  37. ________mov ____cl, 8_________________; Копируем число 8 в регистр cl
  38. ________shl ____ax, cl________________; Выполняем логический сдвиг влево на количество в регистре cl
  39. ________xchg ___al, dl________________; Выполняем обмен содержимого регистров al и dl
  40. ________or _____ax, 3030h_____________; Выполняем логическое ИЛИ над ax с 3030
  41. ________xchg ___ax, bx________________; Выполняем обмен содержимого регистров ax и bx
  42. ________mov ____ah, 02h_______________; Копируем значение функции вывода на консоль в регистр ah
  43. ________cmp ____bh, 30h_______________; Сравниваем значение в регистре ch c 30h
  44. ________je _____PrintOneDigit_________; Если ZF=1, то прыгаем на метку PrintOneDigit
  45. ________mov ____dl, bh________________; Копируем значение регистра ch в регистр dl
  46. ________int ____21h___________________; Вызываем прерывание DOS
  47. ____PrintOneDigit:
  48. ________mov ____dl, bl________________; Копируем значение регистра cl в регистр dl
  49. ________int ____21h___________________; Вызываем прерывание DOS
  50. ________ret___________________________; Возврат из процедуры
  51. ____PrintNumber endp
  52. code ends ____________________________; Конец сегмента кода
  53. end main _____________________________; Конец файла. Точкой входа указывается процедура main
Made on
Tilda