Найти и вывести все симметричные слова - 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 выполняет поиск и вывод всех симметричных слов в строке.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д