Найти и вывести все симметричные слова - Assembler

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

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

Кто знает Ассемблер помогите очень прошу. №1 Задано текст, слова в котором разделены пробелами и знаками препинания. Разработать программу, которая находит и выводит все симметричные слова (например слово абввба является симметричным).

Решение задачи: «Найти и вывести все симметричные слова»

textual
Листинг программы
  1. LOCALS
  2.  
  3. .model small
  4.  
  5. .stack 1000h
  6.  
  7. .data
  8.         ;строка для исследования
  9.         String                  db      'Test test palindrome One, poop! abba bob, "ara"', '$'
  10.         Len                     dw      $-String-1
  11.  
  12.         ;символы разделители слов
  13.         DelimChars              db      '.,!?;:"() ', "'"
  14.         LenDelimChars           dw      $-DelimChars
  15.         ;переменные
  16.         CrLf                    db      0Dh, 0Ah, '$'   ;перевод троки
  17.         msgSourceString         db      'In string:', 0Dh, 0Ah, '$'
  18.         msgPalindrome           db      0Dh, 0Ah, 'A palindrome words:', 0Dh, 0Ah, '$'
  19. .code
  20.  
  21. main    proc
  22.         mov     ax,     @data
  23.         mov     ds,     ax
  24.  
  25.         ;вывод исходной строки
  26.         mov     ah,     09h
  27.         lea     dx,     msgSourceString
  28.         int     21h
  29.         mov     ah,     09h
  30.         lea     dx,     String
  31.         int     21h
  32.         mov     ah,     09h
  33.         lea     dx,     msgPalindrome
  34.         int     21h
  35.  
  36.         lea     si,     String
  37.         mov     cx,     Len
  38.         ;пропускаем все разделители
  39. @@WhileDelimiter:
  40.         mov     al,     [si]
  41.         call    IsDelimChar
  42.         cmp     ah,     0
  43.         je      @@NewWord
  44.         inc     si
  45.         loop    @@WhileDelimiter
  46.  
  47.         jcxz    @@Finish        ;если строка закончилась - выйти
  48.         ;найдено новое слово
  49. @@NewWord:
  50.         mov     dx,     0       ;длина очередного слова пока равна 0
  51.         push    si              ;сохраняем в стеке адрес начала слова
  52.         ;пропускаем все буквы слова до разделителя
  53. @@WhileWord:
  54.         mov     al,     [si]
  55.         call    IsDelimChar
  56.         or      ah,     ah
  57.         jne     @@Break
  58. @@NextChar:
  59.         inc     dx              ;увеличиваем длину слова
  60.         inc     si              ;переходим к следующему символу
  61.         loop    @@WhileWord
  62. @@Break:
  63.         pop     di              ;извлекаем из стека адрес начала слова
  64.         push    si
  65.         push    cx
  66.         mov     si,     di
  67.         mov     cx,     dx
  68.         call    IsPalindrome    ;проверка слова на принадлежность к палиндромам
  69.         pop     cx
  70.         pop     si
  71.         cmp     al,     0
  72.         je      @@Next
  73.  
  74.         push    dx
  75.         push    cx
  76.         mov     cx,     dx
  77.         mov     dx,     di
  78.         call    ShowWord
  79.         pop     cx
  80.         pop     dx
  81.  
  82. @@Next:
  83.         jcxz    @@Finish
  84.         jmp     @@WhileDelimiter
  85.  
  86. @@Finish:
  87.  
  88.         mov     ah,     09h
  89.         lea     dx,     CrLf
  90.         int     21h
  91.  
  92.         mov     ax,     4C00h
  93.         int     21h
  94. main    endp
  95.  
  96. ;Определяет, принадлежит ли символ в al разделителям слов
  97. ;на входе
  98. ; al - символ
  99. ;на выходе
  100. ; ah -  0 (не разделитель), 1 (разделитель)
  101. IsDelimChar     proc
  102.         mov     ah,     0
  103.         pushf
  104.         push    si
  105.         push    di
  106.         push    cx
  107.         push    es
  108.  
  109.         push    ds
  110.         pop     es
  111.         lea     di,     DelimChars
  112.         mov     cx,     LenDelimChars
  113.         cld
  114.         repne   scasb
  115.         jcxz    @@Skip
  116.         jnz     @@Skip
  117.         mov     ah,     1
  118. @@Skip:
  119.         pop     es
  120.         pop     cx
  121.         pop     di
  122.         pop     si
  123.         popf
  124.         ret
  125. IsDelimChar     endp
  126.  
  127. ;Вывод слова на экран
  128. ;на входе
  129. ; dx - адрес начала слова
  130. ; cx - длина слова
  131. ShowWord        proc
  132.         push    ax
  133.         push    cx
  134.         push    dx
  135.  
  136.         mov     ah,     40h
  137.         mov     bx,     1
  138.         mov     cx,     cx
  139.         mov     dx,     dx
  140.         int     21h
  141.         mov     ah,     02h
  142.         mov     dl,     ' '
  143.         int     21h
  144.  
  145.         pop     dx
  146.         pop     cx
  147.         pop     ax
  148.         ret
  149. ShowWord        endp
  150.  
  151. ;Проверка слова на симметричность
  152. ;на входе:
  153. ; si - адрес начала слова
  154. ; cx - длина строки
  155. ;на выходе:
  156. ; al=0 - слово не палиндром
  157. ;   =1 - слово - палиндром
  158. IsPalindrome    proc
  159.         push    bx
  160.         push    cx
  161.         push    dx
  162.         push    si
  163.         push    di
  164.  
  165.         mov     di,     si
  166.         add     di,     cx
  167.         dec     di
  168.         shr     cx,     1       ;проверять половину строки
  169.  
  170. @@For:
  171.         mov     al,     [si]
  172.         inc     si
  173.         dec     di
  174.         cmp     al,     [di+1]
  175.         loopz   @@For
  176.         mov     al,     1
  177.         jz      @@Exit
  178.         mov     al,     0
  179. @@Exit:
  180.         pop     di
  181.         pop     si
  182.         pop     dx
  183.         pop     cx
  184.         pop     bx
  185.         ret
  186. IsPalindrome    endp
  187.  
  188. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы