Найти и вывести все симметричные слова - 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

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

  1. Локальные переменные и установка размера стека
  2. Определение и инициализация данных
    • String - строка для исследования
    • Len - длина строки
    • DelimChars - символы-разделители слов
    • LenDelimChars - длина символов-разделителей
    • CrLf - символы перевода строки
    • msgSourceString - сообщение In string:
    • msgPalindrome - сообщение A palindrome words:
  3. Начало основного кода (main)
    • Установка сегмента данных
    • Вывод исходной строки и сообщения о палиндроме
    • Инициализация указателя на строку
    • Цикл для пропуска всех разделителей
    • Проверка наличия нового слова, определение его длины и основного цикла для проверки слов на палиндром
    • Завершение выполнения программы
  4. Процедура IsDelimChar - определяет, принадлежит ли символ разделителям слов
  5. Процедура ShowWord - выводит слово на экран
  6. Процедура IsPalindrome - проверяет слово на симметричность Этот код на Assembler выполняет поиск и вывод всех симметричных слов в строке.

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

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