Найти и вывести самую длинную цепочку из слов одинаковой длины - Assembler

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

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

Кто знает Ассемблер помогите очень прошу. №2 Задано текст, слова в котором разделены пробелами и знаками препинания. Разработать программу, которая находит и выводит самую длинную цепочку из слов одинаковой длины. Если цепочек нет, то выводит сообщение об этом.(Цепочка - это последовательность из двух и более слов, находящихся рядом.)

Решение задачи: «Найти и вывести самую длинную цепочку из слов одинаковой длины»

textual
Листинг программы
  1. LOCALS
  2.  
  3. .model small
  4.  
  5. .stack 100h
  6.  
  7. .data
  8.         ;строка для исследования
  9.         String                  db      'Mateusz Viste writes: DWOL is '
  10.                                 db      'a tiny tool that computes and '
  11.                                 db      'sends "Wake-on-LAN" packets. '
  12.                                 db      'Wake-on-LAN (WOL) is an Ethernet '
  13.                                 db      'standard that allows a computer to '
  14.                                 db      'be turned on by a network message.', '$'
  15.         Len                     dw      $-String-1
  16.         ;символы разделители слов
  17.         DelimChars              db      '.,!?;:"() ', "'"
  18.         LenDelimChars           dw      $-DelimChars
  19.         ;переменные
  20.         CrLf                    db      0Dh, 0Ah, '$'   ;перевод троки
  21.         CurrChain               dw      ?       ;текущая длина цепочки
  22.         CurrWordsLen            dw      ?       ;длина слова в текущей цепочке
  23.         StartChain              dw      ?       ;адрес начала цепочки
  24.         FinishChain             dw      ?
  25.         MaxChain                dw      ?       ;максимальная длина цепочки
  26.         MaxWordsLen             dw      ?       ;длина слова в максимальной цепочке
  27.         MaxStartChain           dw      ?       ;адрес начала цепочки
  28.         MaxFinishChain          dw      ?
  29.         msgNoChain              db      'No chain', '$'
  30. .code
  31.  
  32. main    proc
  33.         mov     ax,     @data
  34.         mov     ds,     ax
  35.  
  36.  
  37.         mov     ax,     0
  38.         mov     CurrChain,      ax
  39.         mov     CurrWordsLen,   ax
  40.         mov     StartChain,     ax
  41.         mov     FinishChain,    ax
  42.         mov     MaxChain,       ax
  43.         mov     MaxWordsLen,    ax
  44.         mov     MaxStartChain,  ax
  45.         mov     MaxFinishChain, ax
  46.  
  47.         lea     si,     String
  48.         mov     cx,     Len
  49.  
  50.         ;пропускаем все разделители
  51. @@WhileDelimiter:
  52.         mov     al,     [si]
  53.         call    IsDelimChar
  54.         cmp     ah,     0
  55.         je      @@NewWord
  56.         inc     si
  57.         loop    @@WhileDelimiter
  58.  
  59.         jcxz    @@NewChain      ;если строка закончилась - выйти, но перед этим оценить
  60.                                 ;текущую цепочку
  61.         ;найдено новое слово
  62. @@NewWord:
  63.         mov     dx,     0       ;длина очередного слова пока равна 0
  64.         mov     di,     si      ;сохраняем адрес начала слова
  65.         ;пропускаем все буквы слова до разделителя
  66. @@WhileWord:
  67.         mov     al,     [si]
  68.         call    IsDelimChar
  69.         cmp     ah,     0
  70.         jne     @@Break
  71. @@NextChar:
  72.         inc     dx              ;увеличиваем длину слова
  73.         inc     si              ;переходим к следующему символу
  74.         loop    @@WhileWord
  75. @@Break:
  76.         ;сравниваем длину текущего слова с длиной слова в текущей цепочке
  77.         cmp     dx,     CurrWordsLen
  78.         jne     @@NewChain      ;если они не равны, то цепочка прервалась
  79. @@ContChain:
  80.         ;если цепочка продолжается, то увеличить длину цепочки
  81.         inc     CurrChain
  82.         mov     FinishChain,    si
  83.         dec     FinishChain
  84.         jmp     @@Next
  85. @@NewChain:                     ;иначе - цепочка прервалась
  86.         ;инициализация параметров новой цепочки
  87.         mov     CurrChain,      1
  88.         mov     CurrWordsLen,   dx
  89.         mov     StartChain,     di
  90.         mov     FinishChain,    si
  91.         dec     FinishChain
  92.         jmp     @@Next
  93.  
  94. @@Next:
  95.         mov     ax,     CurrChain       ;сравниваем длину цепочки с максимальной
  96.         cmp     ax,     MaxChain
  97.         jbe     @@SkipCopy
  98.         ;копирование параметров максимальной цепочки
  99.         mov     ax,     CurrChain
  100.         mov     MaxChain,       ax
  101.         mov     ax,     CurrWordsLen
  102.         mov     MaxWordsLen,    ax
  103.         mov     ax,     StartChain
  104.         mov     MaxStartChain,  ax
  105.         mov     ax,     FinishChain
  106.         mov     MaxFinishChain, ax
  107. @@SkipCopy:
  108.  
  109.         jcxz    @@Finish
  110.         jmp     @@WhileDelimiter
  111.  
  112. @@Finish:
  113.  
  114.         ;вывод результатов
  115.         cmp     MaxChain,       2
  116.         jae     @@ShowChain
  117.         mov     ah,     09h
  118.         lea     dx,     msgNoChain
  119.         int     21h
  120.         jmp     @@Exit
  121. @@ShowChain:
  122.         mov     si,     MaxStartChain
  123.         mov     cx,     MaxFinishChain
  124.         sub     cx,     si
  125.         add     cx,     1
  126.         call    ShowSubStr
  127.  
  128. @@Exit:
  129.         mov     ax,     4C00h
  130.         int     21h
  131. main    endp
  132.  
  133. ;Определяет, принадлежит ли символ в al разделителям слов
  134. ;на входе
  135. ; al - символ
  136. ;на выходе
  137. ; ah -  0 (не разделитель), 1 (разделитель)
  138. IsDelimChar     proc
  139.         mov     ah,     0
  140.         pushf
  141.         push    si
  142.         push    di
  143.         push    cx
  144.         push    es
  145.  
  146.         push    ds
  147.         pop     es
  148.         lea     di,     DelimChars
  149.         mov     cx,     LenDelimChars
  150.         cld
  151.         repne   scasb
  152.         jcxz    @@Skip
  153.         jnz     @@Skip
  154.         mov     ah,     1
  155. @@Skip:
  156.         pop     es
  157.         pop     cx
  158.         pop     di
  159.         pop     si
  160.         popf
  161.         ret
  162. IsDelimChar     endp
  163.  
  164. ;процедура вывода подстроки
  165. ;на входе:
  166. ;  ds:si - адрес первого символа подстроки
  167. ;  cx    - длина выводимой подсторки
  168. ShowSubStr      proc
  169.         push    ax
  170.         push    bx
  171.         push    cx
  172.         push    dx
  173.         mov     ah,     40h
  174.         mov     bx,     1
  175.         mov     cx,     cx
  176.         mov     dx,     si
  177.         int     21h
  178.         pop     dx
  179.         pop     cx
  180.         pop     bx
  181.         pop     ax
  182.         ret
  183. ShowSubStr      endp
  184.  
  185. end     main

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

  1. Объявление переменных в сегменте данных:
    • String - строка для исследования
    • Len - длина строки String
    • DelimChars - символы разделители слов
    • LenDelimChars - длина строки DelimChars
    • CrLf - символ перевода строки
    • CurrChain - текущая длина цепочки
    • CurrWordsLen - длина слова в текущей цепочке
    • StartChain - адрес начала цепочки
    • FinishChain - адрес конца цепочки
    • MaxChain - максимальная длина цепочки
    • MaxWordsLen - длина слова в максимальной цепочке
    • MaxStartChain - адрес начала максимальной цепочки
    • MaxFinishChain - адрес конца максимальной цепочки
    • msgNoChain - сообщение No chain
  2. Инициализация переменных:
    • Используются команды mov для установки начальных значений всех переменных в 0 - ax, CurrChain, CurrWordsLen, StartChain, FinishChain, MaxChain, MaxWordsLen, MaxStartChain, MaxFinishChain
  3. Чтение строки и анализ слов:
    • Используется цикл для чтения каждого символа в строке и анализа слов
    • При обнаружении нового слова устанавливается длина и проверяется соответствие длины предыдущего слова текущей цепочке
  4. Оценка цепочек:
    • Сравнение длины текущей цепочки со значениями максимальной длины цепочки, затем копирование параметров максимальной цепочки (если нужно)
  5. Вывод результатов:
    • Печать сообщения No chain в случае отсутствия цепочек заданной длины или вывод максимальной цепочки при её наличии
    • Используются команды mov, lea и int для вывода сообщений с использованием прерываний DOS
  6. Процедура IsDelimChar:
    • Определение, принадлежит ли символ к разделителям слов
  7. Процедура ShowSubStr:
    • Вывод подстроки на экран с использованием прерываний DOS
  8. Завершение программы:
    • Программа завершается с использованием прерывания DOS Этот код, возможно, написан на языке ассемблера для MS-DOS, так как используются прямые обращения к прерываниям DOS и регистрам процессора (например, ax, dx, ah).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

14   голосов , оценка 4.143 из 5

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

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

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