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