Расположить слова в обратном порядке - 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
Объяснение кода листинга программы
- Объявляются локальные переменные.
- Устанавливается модель программы и размер стека.
- Объявляются переменные для хранения символа-разделителя, исходной и преобразованной строк, а также для вывода сообщений.
- В процедуре
main
инициализируется сегмент данных. - На экран выводится сообщение
Исходная строка:
. - На экран выводится исходная строка.
- На экран выводится символ новой строки.
- Вычисляется длина исходной строки и устанавливаются указатели на последний символ и на первый элемент новой строки.
- Происходит пропуск всех разделителей, при этом они копируются в новую строку.
- Если строка закончилась, происходит выход из процедуры.
- Вычисляется длина нового слова и адрес его начала.
- Происходит копирование нового слова и пропуск символов пока не будет найден разделитель.
- В конце строки записывается символ ограничитель строки.
- На экран выводится сообщение
Результирующая строка:
. - На экран выводится преобразованная строка.
- На экран выводится символ новой строки.
- Программа завершается.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д