В строке в словах с четным номером изменить порядок букв на обратный - Assembler
Формулировка задачи:
Доброго времени суток, у меня не работает программа в эмуляторе 8086. В чем может быть ошибка?
Вот сам код программы
эта программа в словах с четным номером должна изменять порядок букв на обратный.
Листинг программы
- .model flat
- BSIZE equ 30
- .data
- mass db 'sdes doljni bit iznemeni slova no oni menyajutsa'
- db 0dh, 0ah
- .code
- start:
- mov stdout, eax
- mov ecx, mass
- mov dl, 01010101b
- mov bl, ' '
- mov edi, mass
- firststep:
- test ecx, ecx
- mov al, bl
- jz endmas
- mov esi, edi
- je nextstep
- inc edi
- nextstep:
- push ecx
- push edi
- mov ecx, edi
- sub ecx, esi
- dec edi
- dec ecx
- dec edi
- shr ecx, 1
- jz back
- prov:
- mov al, [esi]
- xchg al, [edi]
- mov [esi], al
- dec edi
- inc esi
- dec ecx
- jnz @B
- back:
- pop edi
- pop ecx
- jmp
- endmas:
- push 1800h
- call Sleep
- end start
Решение задачи: «В строке в словах с четным номером изменить порядок букв на обратный»
textual
Листинг программы
- LOCALS
- .model small
- .stack 100h
- .data
- DelimChar db ' ' ;символ, разделитель слов
- String db 'Дан текст 35 символов Определить количество слов содержащих более 3-х символов Слова разделяются одним пробелом', '$'
- Len dw $-String
- 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
- lea si, String
- mov cx, Len
- mov CountWords, 0
- ;пропускаем все разделители
- @@WhileDelimiter:
- mov al, [si]
- cmp al, DelimChar
- jne @@NewWord
- inc si
- loop @@WhileDelimiter
- jcxz @@Finish ;если строка закончилась - выйти
- ;найдено новое слово
- @@NewWord:
- mov di, si ;di - указатель на начало слова
- inc CountWords ;увеличиваем счётчик слов на 1
- ;пропускаем все буквы слова до разделителя
- @@WhileWord:
- mov al, [si]
- cmp al, DelimChar
- je @@Break
- inc dx ;увеличиваем длину слова
- inc si ;переходим к следующему символу
- loop @@WhileWord
- @@Break:
- test CountWords, 1 ;это чётное слово?
- jnz @@SkipReverse ;если длина слова больше трёх
- push si
- dec si ;si - указатель на последнюю букву слова
- @@ReverseWord:
- xchg al, [si]
- xchg al, [di]
- xchg al, [si]
- inc di
- dec si
- cmp si, di
- ja @@ReverseWord
- pop si
- @@SkipReverse:
- jcxz @@Finish
- jmp @@WhileDelimiter
- @@Finish:
- ;вывод результатов
- ;Результирующая строка
- mov ah, 09h
- lea dx, msgResString
- int 21h
- mov ah, 09h
- lea dx, String
- int 21h
- mov ah, 09h
- lea dx, CrLf
- int 21h
- ;завершение программы
- mov ax, 4C00h
- int 21h
- main endp
- end main
Объяснение кода листинга программы
- Создание переменных:
DelimChar
- символ, разделитель слов, присвоение значения ' ' (пробел)String
- исходная строка для обработки, присвоение значения ('Дан текст 35 символов Определить количество слов содержащих более 3-х символов Слова разделяются одним пробелом')Len
- длина строки, вычисленная как $-StringmsgInitString
- сообщениеИсходная строка:
, пробел, перенос строки и символ конца строки ('$')msgResString
- сообщениеРезультирующая строка:
, пробел, перенос строки и символ конца строки ('$')CrLf
- комбинация символов возврата каретки и перевода строки (0Dh, 0Ah, '$')CountWords
- общее количество слов в строке, начальное значение неопределено
- Обработка строки:
- Вывод исходной строки на экран
- Пропуск разделителей (пробелов)
- Обработка каждого слова в строке
- Проверка длины слова и изменение порядка букв на обратный для слов с четным порядковым номером
- Вывод результирующей строки на экран
- Завершение программы Программа обрабатывает исходную строку, определяет количество слов в ней, меняет порядок букв в словах с четным порядковым номером на обратный и выводит результирующую строку на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д