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

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

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

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

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

textual
Листинг программы
model   small
.stack  100h
.code
begin:  mov ax,@data
    mov ds,ax
    mov ah,9
    lea dx,dbEnt
    int 21h
.data
dbEnt   db  10,13,'Enter string:$'
.code
    mov ah,10
    lea dx,dbMax
    int 21h
.data
dbMax   db  255
dbLen   db  ?
dbStr   db  255 dup(?)
.code
    lea si,dbLen
    push    si
    mov cl,[si+1]
    xor ch,ch
    add si,cx
    mov byte ptr[si],' '
    pop si
    xor di,di
    mov al,' '
@@01:   inc si
    cmp al,[si]
    loopz   @@01
    inc cx
    mov bx,-1
@@02:   inc bx
    cmp al,[bx+si]
    loopnz  @@02
    inc cx
    cmp bx,4
    jl  @@03
    inc di
@@03:   add si,bx
    loop    @@01
@@04:   mov ah,9
    lea dx,dbRes
    int 21h
.data
dbRes   db  10,13,'Result:$'
.code
    mov ax,10
    xchg    ax,di
    xor cx,cx
@@05:   xor dx,dx
    div di
    push    dx
    inc cx
    or  ax,ax
    jnz @@05
@@06:   pop ax
    or  al,'0'
    int 29h
    loop    @@06
    mov ax,4C00h
    int 21h
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
Похожие ответы