В строке в словах с четным номером изменить порядок букв на обратный - 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

Объяснение кода листинга программы

  1. Создание переменных:
    • DelimChar - символ, разделитель слов, присвоение значения ' ' (пробел)
    • String - исходная строка для обработки, присвоение значения ('Дан текст 35 символов Определить количество слов содержащих более 3-х символов Слова разделяются одним пробелом')
    • Len - длина строки, вычисленная как $-String
    • msgInitString - сообщение Исходная строка:, пробел, перенос строки и символ конца строки ('$')
    • msgResString - сообщение Результирующая строка:, пробел, перенос строки и символ конца строки ('$')
    • CrLf - комбинация символов возврата каретки и перевода строки (0Dh, 0Ah, '$')
    • CountWords - общее количество слов в строке, начальное значение неопределено
  2. Обработка строки:
    • Вывод исходной строки на экран
    • Пропуск разделителей (пробелов)
    • Обработка каждого слова в строке
    • Проверка длины слова и изменение порядка букв на обратный для слов с четным порядковым номером
  3. Вывод результирующей строки на экран
  4. Завершение программы Программа обрабатывает исходную строку, определяет количество слов в ней, меняет порядок букв в словах с четным порядковым номером на обратный и выводит результирующую строку на экран.

Оцени полезность:

13   голосов , оценка 4.154 из 5
Похожие ответы