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

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

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

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

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

textual
Листинг программы
LOCALS
 
.model small
 
.stack 100h
 
.data
        DelimChar       db      ' '     ;символ, разделитель слов
        String          db      'Необходимо из строки состоящую из слов разделенных пробеллами расположить слова в обратном порядке', '$'
        Len             dw      $-String-1
        NewString       dw      255 dup(?)
 
        msgInitString   db      'Исходная строка:', 0Dh, 0Ah, '$'
        msgResString    db      'Результирующая строка:', 0Dh, 0Ah, '$'
        CrLf            db      0Dh, 0Ah, '$'
        CountWords      dw      ?       ;общее количество слов
.code
 
main    proc
        mov     ax,     @data
        mov     ds,     ax
 
        mov     ah,     09h
        lea     dx,     msgInitString
        int     21h
        mov     ah,     09h
        lea     dx,     String
        int     21h
        mov     ah,     09h
        lea     dx,     CrLf
        int     21h
 
        mov     cx,     Len     ;cx - длина исходной строки
        lea     si,     String  ;si - указатель на последний символ строки
        add     si,     cx
        dec     si
        lea     di,     NewString       ;di - указатель на первый элемент новой строки
        ;пропускаем все разделители
        ;и заодно копируем их в новую строку
@@WhileDelimiter:
        mov     al,     [si]
        cmp     al,     DelimChar
        jne     @@NewWord
        mov     [di],   al
        dec     si
        inc     di
        loop    @@WhileDelimiter
 
        jcxz    @@Finish        ;если строка закончилась - выйти
        ;найдено новое слово
@@NewWord:
        ;пропускаем все буквы слова до разделителя
        ;вычисляем длину слова и адрес его начала
        mov     dx,     0       ;dx - длина очередного слова
@@WhileWord:
        mov     al,     [si]
        cmp     al,     DelimChar
        je      @@Break
        inc     dx              ;увеличиваем длину слова
        dec     si              ;переходим к следующему символу
 
        loop    @@WhileWord
@@Break:
        ;копирование нового слова
        push    si
        push    cx
        push    es
        pushf
        push    ds
        pop     es
        cld
        inc     si              ;si - указатель на первую букву слова
        mov     cx,     dx
        rep     movsb
        popf
        pop     es
        pop     cx
        pop     si
@@SkipReverse:
        jcxz    @@Finish
        jmp     @@WhileDelimiter
 
@@Finish:
 
        mov     [di],   byte ptr '$'    ;для вывода строки на экран в её конец
                                        ;записываем символ ограничитель строки
        ;вывод результатов
        ;Результирующая строка
        mov     ah,     09h
        lea     dx,     msgResString
        int     21h
        mov     ah,     09h
        lea     dx,     NewString
        int     21h
        mov     ah,     09h
        lea     dx,     CrLf
        int     21h
 
        ;завершение программы
        mov     ax,     4C00h
        int     21h
main    endp
 
end     main

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

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

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

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