Найти и вывести все симметричные слова - Assembler
Формулировка задачи:
Кто знает Ассемблер помогите очень прошу.
№1 Задано текст, слова в котором разделены пробелами и знаками препинания.
Разработать программу, которая находит и выводит все симметричные слова (например слово абввба является симметричным).
Решение задачи: «Найти и вывести все симметричные слова»
textual
Листинг программы
- LOCALS
- .model small
- .stack 1000h
- .data
- ;строка для исследования
- String db 'Test test palindrome One, poop! abba bob, "ara"', '$'
- Len dw $-String-1
- ;символы разделители слов
- DelimChars db '.,!?;:"() ', "'"
- LenDelimChars dw $-DelimChars
- ;переменные
- CrLf db 0Dh, 0Ah, '$' ;перевод троки
- msgSourceString db 'In string:', 0Dh, 0Ah, '$'
- msgPalindrome db 0Dh, 0Ah, 'A palindrome words:', 0Dh, 0Ah, '$'
- .code
- main proc
- mov ax, @data
- mov ds, ax
- ;вывод исходной строки
- mov ah, 09h
- lea dx, msgSourceString
- int 21h
- mov ah, 09h
- lea dx, String
- int 21h
- mov ah, 09h
- lea dx, msgPalindrome
- int 21h
- lea si, String
- mov cx, Len
- ;пропускаем все разделители
- @@WhileDelimiter:
- mov al, [si]
- call IsDelimChar
- cmp ah, 0
- je @@NewWord
- inc si
- loop @@WhileDelimiter
- jcxz @@Finish ;если строка закончилась - выйти
- ;найдено новое слово
- @@NewWord:
- mov dx, 0 ;длина очередного слова пока равна 0
- push si ;сохраняем в стеке адрес начала слова
- ;пропускаем все буквы слова до разделителя
- @@WhileWord:
- mov al, [si]
- call IsDelimChar
- or ah, ah
- jne @@Break
- @@NextChar:
- inc dx ;увеличиваем длину слова
- inc si ;переходим к следующему символу
- loop @@WhileWord
- @@Break:
- pop di ;извлекаем из стека адрес начала слова
- push si
- push cx
- mov si, di
- mov cx, dx
- call IsPalindrome ;проверка слова на принадлежность к палиндромам
- pop cx
- pop si
- cmp al, 0
- je @@Next
- push dx
- push cx
- mov cx, dx
- mov dx, di
- call ShowWord
- pop cx
- pop dx
- @@Next:
- jcxz @@Finish
- jmp @@WhileDelimiter
- @@Finish:
- mov ah, 09h
- lea dx, CrLf
- int 21h
- mov ax, 4C00h
- int 21h
- main endp
- ;Определяет, принадлежит ли символ в al разделителям слов
- ;на входе
- ; al - символ
- ;на выходе
- ; ah - 0 (не разделитель), 1 (разделитель)
- IsDelimChar proc
- mov ah, 0
- pushf
- push si
- push di
- push cx
- push es
- push ds
- pop es
- lea di, DelimChars
- mov cx, LenDelimChars
- cld
- repne scasb
- jcxz @@Skip
- jnz @@Skip
- mov ah, 1
- @@Skip:
- pop es
- pop cx
- pop di
- pop si
- popf
- ret
- IsDelimChar endp
- ;Вывод слова на экран
- ;на входе
- ; dx - адрес начала слова
- ; cx - длина слова
- ShowWord proc
- push ax
- push cx
- push dx
- mov ah, 40h
- mov bx, 1
- mov cx, cx
- mov dx, dx
- int 21h
- mov ah, 02h
- mov dl, ' '
- int 21h
- pop dx
- pop cx
- pop ax
- ret
- ShowWord endp
- ;Проверка слова на симметричность
- ;на входе:
- ; si - адрес начала слова
- ; cx - длина строки
- ;на выходе:
- ; al=0 - слово не палиндром
- ; =1 - слово - палиндром
- IsPalindrome proc
- push bx
- push cx
- push dx
- push si
- push di
- mov di, si
- add di, cx
- dec di
- shr cx, 1 ;проверять половину строки
- @@For:
- mov al, [si]
- inc si
- dec di
- cmp al, [di+1]
- loopz @@For
- mov al, 1
- jz @@Exit
- mov al, 0
- @@Exit:
- pop di
- pop si
- pop dx
- pop cx
- pop bx
- ret
- IsPalindrome endp
- end main
Объяснение кода листинга программы
- Локальные переменные и установка размера стека
- Определение и инициализация данных
String
- строка для исследованияLen
- длина строкиDelimChars
- символы-разделители словLenDelimChars
- длина символов-разделителейCrLf
- символы перевода строкиmsgSourceString
- сообщениеIn string:
msgPalindrome
- сообщениеA palindrome words:
- Начало основного кода (main)
- Установка сегмента данных
- Вывод исходной строки и сообщения о палиндроме
- Инициализация указателя на строку
- Цикл для пропуска всех разделителей
- Проверка наличия нового слова, определение его длины и основного цикла для проверки слов на палиндром
- Завершение выполнения программы
- Процедура
IsDelimChar
- определяет, принадлежит ли символ разделителям слов - Процедура
ShowWord
- выводит слово на экран - Процедура
IsPalindrome
- проверяет слово на симметричность Этот код на Assembler выполняет поиск и вывод всех симметричных слов в строке.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д