Расположить слова в обратном порядке - Assembler

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

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

Привет, помогите пожалуйста.решить задачу: Необходимо из строки, состоящую из слов, разделенных пробеллами, расположить слова в обратном порядке. Не получается совсем, благодарю за любую помощь

Решение задачи: «Расположить слова в обратном порядке»

textual
Листинг программы
  1. LOCALS
  2.  
  3. .model small
  4.  
  5. .stack 100h
  6.  
  7. .data
  8.         DelimChar       db      ' '     ;символ, разделитель слов
  9.         String          db      'Необходимо из строки состоящую из слов разделенных пробеллами расположить слова в обратном порядке', '$'
  10.         Len             dw      $-String-1
  11.         NewString       dw      255 dup(?)
  12.  
  13.         msgInitString   db      'Исходная строка:', 0Dh, 0Ah, '$'
  14.         msgResString    db      'Результирующая строка:', 0Dh, 0Ah, '$'
  15.         CrLf            db      0Dh, 0Ah, '$'
  16.         CountWords      dw      ?       ;общее количество слов
  17. .code
  18.  
  19. main    proc
  20.         mov     ax,     @data
  21.         mov     ds,     ax
  22.  
  23.         mov     ah,     09h
  24.         lea     dx,     msgInitString
  25.         int     21h
  26.         mov     ah,     09h
  27.         lea     dx,     String
  28.         int     21h
  29.         mov     ah,     09h
  30.         lea     dx,     CrLf
  31.         int     21h
  32.  
  33.         mov     cx,     Len     ;cx - длина исходной строки
  34.         lea     si,     String  ;si - указатель на последний символ строки
  35.         add     si,     cx
  36.         dec     si
  37.         lea     di,     NewString       ;di - указатель на первый элемент новой строки
  38.         ;пропускаем все разделители
  39.         заодно копируем их в новую строку
  40. @@WhileDelimiter:
  41.         mov     al,     [si]
  42.         cmp     al,     DelimChar
  43.         jne     @@NewWord
  44.         mov     [di],   al
  45.         dec     si
  46.         inc     di
  47.         loop    @@WhileDelimiter
  48.  
  49.         jcxz    @@Finish        ;если строка закончилась - выйти
  50.         ;найдено новое слово
  51. @@NewWord:
  52.         ;пропускаем все буквы слова до разделителя
  53.         ;вычисляем длину слова и адрес его начала
  54.         mov     dx,     0       ;dx - длина очередного слова
  55. @@WhileWord:
  56.         mov     al,     [si]
  57.         cmp     al,     DelimChar
  58.         je      @@Break
  59.         inc     dx              ;увеличиваем длину слова
  60.         dec     si              ;переходим к следующему символу
  61.  
  62.         loop    @@WhileWord
  63. @@Break:
  64.         ;копирование нового слова
  65.         push    si
  66.         push    cx
  67.         push    es
  68.         pushf
  69.         push    ds
  70.         pop     es
  71.         cld
  72.         inc     si              ;si - указатель на первую букву слова
  73.         mov     cx,     dx
  74.         rep     movsb
  75.         popf
  76.         pop     es
  77.         pop     cx
  78.         pop     si
  79. @@SkipReverse:
  80.         jcxz    @@Finish
  81.         jmp     @@WhileDelimiter
  82.  
  83. @@Finish:
  84.  
  85.         mov     [di],   byte ptr '$'    ;для вывода строки на экран в её конец
  86.                                         ;записываем символ ограничитель строки
  87.         ;вывод результатов
  88.         ;Результирующая строка
  89.         mov     ah,     09h
  90.         lea     dx,     msgResString
  91.         int     21h
  92.         mov     ah,     09h
  93.         lea     dx,     NewString
  94.         int     21h
  95.         mov     ah,     09h
  96.         lea     dx,     CrLf
  97.         int     21h
  98.  
  99.         ;завершение программы
  100.         mov     ax,     4C00h
  101.         int     21h
  102. main    endp
  103.  
  104. end     main

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

  1. Объявляются локальные переменные.
  2. Устанавливается модель программы и размер стека.
  3. Объявляются переменные для хранения символа-разделителя, исходной и преобразованной строк, а также для вывода сообщений.
  4. В процедуре main инициализируется сегмент данных.
  5. На экран выводится сообщение Исходная строка:.
  6. На экран выводится исходная строка.
  7. На экран выводится символ новой строки.
  8. Вычисляется длина исходной строки и устанавливаются указатели на последний символ и на первый элемент новой строки.
  9. Происходит пропуск всех разделителей, при этом они копируются в новую строку.
  10. Если строка закончилась, происходит выход из процедуры.
  11. Вычисляется длина нового слова и адрес его начала.
  12. Происходит копирование нового слова и пропуск символов пока не будет найден разделитель.
  13. В конце строки записывается символ ограничитель строки.
  14. На экран выводится сообщение Результирующая строка:.
  15. На экран выводится преобразованная строка.
  16. На экран выводится символ новой строки.
  17. Программа завершается.

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


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

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

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

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

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

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