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