Количество слов, содержащих более 3-х символов - Assembler

Узнай цену своей работы

Формулировка задачи:

Дан текст 35 символов. Определить количество слов, содержащих более 3-х символов. Слова разделяются одним пробелом

Решение задачи: «Количество слов, содержащих более 3-х символов»

textual
Листинг программы
  1. model   small
  2. .stack  100h
  3. .code
  4. begin:  mov ax,@data
  5.     mov ds,ax
  6.     mov ah,9
  7.     lea dx,dbEnt
  8.     int 21h
  9. .data
  10. dbEnt   db  10,13,'Enter string:$'
  11. .code
  12.     mov ah,10
  13.     lea dx,dbMax
  14.     int 21h
  15. .data
  16. dbMax   db  255
  17. dbLen   db  ?
  18. dbStr   db  255 dup(?)
  19. .code
  20.     lea si,dbLen
  21.     push    si
  22.     mov cl,[si+1]
  23.     xor ch,ch
  24.     add si,cx
  25.     mov byte ptr[si],' '
  26.     pop si
  27.     xor di,di
  28.     mov al,' '
  29. @@01:   inc si
  30.     cmp al,[si]
  31.     loopz   @@01
  32.     inc cx
  33.     mov bx,-1
  34. @@02:   inc bx
  35.     cmp al,[bx+si]
  36.     loopnz  @@02
  37.     inc cx
  38.     cmp bx,4
  39.     jl  @@03
  40.     inc di
  41. @@03:   add si,bx
  42.     loop    @@01
  43. @@04:   mov ah,9
  44.     lea dx,dbRes
  45.     int 21h
  46. .data
  47. dbRes   db  10,13,'Result:$'
  48. .code
  49.     mov ax,10
  50.     xchg    ax,di
  51.     xor cx,cx
  52. @@05:   xor dx,dx
  53.     div di
  54.     push    dx
  55.     inc cx
  56.     or  ax,ax
  57.     jnz @@05
  58. @@06:   pop ax
  59.     or  al,'0'
  60.     int 29h
  61.     loop    @@06
  62.     mov ax,4C00h
  63.     int 21h
  64. end begin

Объяснение кода листинга программы

  1. Объявляется модель программы (.model small).
  2. Выделяется память стека размером 100h (.stack 100h).
  3. Начинается секция кода (begin:).
  4. Переменной ax присваивается адрес данных (mov ax,@data).
  5. Значение регистра ax помещается в регистр ds для доступа к данным (mov ds,ax).
  6. В регистр ah помещается код для вывода строки (mov ah,9).
  7. В переменную dx записывается адрес строки dbEnt для отображения сообщения ввода строки (lea dx,dbEnt).
  8. Вызывается прерывание 21h для отображения сообщения и ввода строки (int 21h).
  9. Объявляется секция данных (.data`).
  10. dbEnt - объявляется массив байта, содержащий константы для ввода строки (.db 10,13,'Enter string:$').
  11. Снова начинается секция кода (.code`).
  12. В регистр ah помещается код для чтения строки (mov ah,10).
  13. В переменную dx записывается адрес строки dbMax для отображения сообщения о максимальной длине строки (lea dx,dbMax).
  14. Вызывается прерывание 21h для отображения сообщения и ввода строки (int 21h).
  15. Объявляется секция данных (.data`).
  16. dbMax - объявляется массив байта, содержащий максимальную длину строки (.db 255).
  17. dbLen - объявляется байтовая переменная (db ?) для хранения длины строки.
  18. dbStr - объявляется массив байтов (db 255 dup(?)) для хранения введенной строки.
  19. Снова начинается секция кода (.code`).
  20. В регистр si записывается адрес переменной dbLen (lea si,dbLen).
  21. Значение регистра si помещается в стек (push si).
  22. Значение второго байта, на который указывает si, записывается в регистр cl (mov cl,[si+1]).
  23. Регистр ch устанавливается в 0 (xor ch,ch).
  24. К регистру si добавляется значение регистра cx (add si,cx).
  25. Значение по адресу si устанавливается в пробел (mov byte ptr[si],' ').
  26. Значение из стека помещается в регистр si (pop si).
  27. Значение al увеличивается на 1 (inc si).
  28. Сравнивается значение в регистре al и значение по адресу, на который указывает si (cmp al,[si]).
  29. Происходит повторение предыдущего шага cx раз или до тех пор, пока флаг ZF равен 1 (loopz @@01).
  30. Значение регистра cx увеличивается на 1 (inc cx).
  31. Значение регистра bx устанавливается в -1 (mov bx,-1).
  32. Следующий цикл начинается с метки @@02.
  33. Значение регистра bx увеличивается на 1 (inc bx).
  34. Сравнивается значение в регистре al и значение по адресу, на который указывает bx и si (cmp al,[bx+si]).
  35. Происходит повторение предыдущего шага cx раз или до тех пор, пока флаг ZF равен 0 (loopnz @@02).
  36. Значение регистра bx увеличивается на 1 (inc cx).
  37. Сравнивается значение регистра bx и 4 (cmp bx,4).
  38. Если значение регистра bx меньше 4, выполнение кода переходит к метке @@03 (jl @@03).
  39. Значение регистра di увеличивается на 1 (inc di).
  40. Значение регистра si увеличивается на значение регистра bx (add si,bx).
  41. Происходит повторение инструкций с метки @@01 (loop @@01).
  42. Значение в регистре ah устанавливается в 9 (mov ah,9).
  43. В переменную dx записывается адрес строки dbRes для отображения сообщения с результатом (lea dx,dbRes).
  44. Вызывается прерывание 21h для отображения сообщения и результата (int 21h).
  45. Снова начинается секция данных (.data`).
  46. dbRes - объявляется массив байта, содержащий константы для вывода результата (.db 10,13,'Result:$').
  47. Снова начинается секция кода (.code`).
  48. В регистр ax помещается значение 10 (mov ax,10).
  49. Значения регистров ax и di меняются местами (xchg ax,di).
  50. Значение регистра cx устанавливается в 0 (xor cx,cx).
  51. Начинается цикл с метки @@05.
  52. Значение регистра dx устанавливается в 0 (xor dx,dx).
  53. Происходит деление регистров ax и di. Частное помещается в ax, остаток в dx (div di).
  54. Остаток помещается в стек (push dx).
  55. Значение регистра cx увеличивается на 1 (inc cx).
  56. Если результат деления не равен 0, выполнение кода переходит к метке @@05 (jnz @@05).
  57. Начинается цикл с метки @@06.
  58. Значение из стека помещается в регистр ax (pop ax).
  59. Значение al преобразуется в символ числа (or al,'0').
  60. Символ числа выводится на экран (int 29h).
  61. Происходит повторение инструкций с метки @@06 (loop @@06).
  62. Значение регистра ax устанавливается как 4С00h (mov ax,4C00h).
  63. Вызывается прерывание 21h для завершения программы (int 21h).
  64. Окончание программы (end begin).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.818 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы