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