Определение количества предложений в заданном тексте - Assembler

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

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

Определите количество предложений в заданном тексте (предложение заканчивается либо точкой, либо вопросительным или восклицательным знаком) в ассемблере надо

Решение задачи: «Определение количества предложений в заданном тексте»

textual
Листинг программы
.model small                
.386                        
 
.data
count   db  0
msg     db  'One. Two! Three? Four! Five. Six? Seven?'
len     equ $-msg
 
.stack                  
    db  256 dup(?)      
 
.code                   
start:                  
    mov ax,@data
    mov ds,ax
    
    push ds
    pop es
    
    cld
 
lea si,msg+1 ; предложение не может кончится не начавшись
mov cx,len
dec cx                 ; и мы сэкономим на проверке первого знака
find:
    lodsb
        
    cmp al,'.'
    jz ok
        
    cmp al,'!'
    jz ok
        
    cmp al,'?'
    jz ok
        
    jmp skip
        
    ok:
    inc count
        
    skip:   
loop find
 
exit:   
    mov ah,4Ch              
    mov al,00h              
    int 21h
end start

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

  1. Объявлены две переменные: count и msg.
  2. Переменная len инициализируется значением -msg.
  3. Задается начальный адрес стека.
  4. Код размещается в сегменте code.
  5. Выполняется команда mov ax,@data для установки сегмента данных в ax.
  6. Выполняется команда mov ds,ax для установки ds в сегмент данных.
  7. Выполняется команда push ds для сохранения ds на стеке.
  8. Выполняется команда pop es для восстановления ds из стека.
  9. Выполняется команда cld для установки флага направления в csd (указатель стека).
  10. Выполняется команда lea si,msg+1 для инициализации si началом строки msg.
  11. Выполняется команда mov cx,len для установки cx равным len.
  12. Выполняется команда dec cx для уменьшения cx на единицу (предложение не может закончиться не начавшись).
  13. Выполняется команда find, которая осуществляет поиск знаков препинания в строке msg.
  14. Если знак равен точке, выполняется команда jz для перехода к следующей итерации цикла.
  15. Если знак равен восклицательному знаку, выполняется команда jz для перехода к следующей итерации цикла.
  16. Если знак равен вопросительному знаку, выполняется команда jz для перехода к следующей итерации цикла.
  17. Если знак не равен ни одному из перечисленных, выполняется команда jmp для перехода к следующей итерации цикла.
  18. Если знак равен точке, выполняется команда inc count для увеличения count на единицу.
  19. Если знак равен восклицательному знаку, выполняется команда inc count для увеличения count на единицу.
  20. Если знак равен вопросительному знаку, выполняется команда inc count для увеличения count на единицу.
  21. Если знак не равен ни одному из перечисленных, выполняется команда jmp для перехода к следующей итерации цикла.
  22. После окончания цикла выполняется команда loop find.
  23. Если все знаки проверены, выполняется команда exit.
  24. Выполняется команда mov ah,4Ch для закрытия программы.
  25. Выполняется команда mov al,00h для установки регистра al в ноль.
  26. Выполняется команда int 21h для выхода из программы.

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

5   голосов , оценка 4.2 из 5
Похожие ответы