В строке в словах с четным номером изменить порядок букв на обратный - Assembler

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток, у меня не работает программа в эмуляторе 8086. В чем может быть ошибка? Вот сам код программы
Листинг программы
  1. .model flat
  2. BSIZE equ 30
  3. .data
  4. mass db 'sdes doljni bit iznemeni slova no oni menyajutsa'
  5. db 0dh, 0ah
  6. .code
  7. start:
  8. mov stdout, eax
  9. mov ecx, mass
  10. mov dl, 01010101b
  11. mov bl, ' '
  12. mov edi, mass
  13. firststep:
  14. test ecx, ecx
  15. mov al, bl
  16. jz endmas
  17. mov esi, edi
  18. je nextstep
  19. inc edi
  20. nextstep:
  21. push ecx
  22. push edi
  23. mov ecx, edi
  24. sub ecx, esi
  25. dec edi
  26. dec ecx
  27. dec edi
  28. shr ecx, 1
  29. jz back
  30. prov:
  31. mov al, [esi]
  32. xchg al, [edi]
  33. mov [esi], al
  34. dec edi
  35. inc esi
  36. dec ecx
  37. jnz @B
  38. back:
  39. pop edi
  40. pop ecx
  41. jmp
  42. endmas:
  43. push 1800h
  44. call Sleep
  45. end start
эта программа в словах с четным номером должна изменять порядок букв на обратный.

Решение задачи: «В строке в словах с четным номером изменить порядок букв на обратный»

textual
Листинг программы
  1. LOCALS
  2.  
  3. .model small
  4.  
  5. .stack 100h
  6.  
  7. .data
  8.         DelimChar       db      ' '     ;символ, разделитель слов
  9.         String          db      'Дан текст 35 символов Определить количество слов содержащих более 3-х символов Слова разделяются одним пробелом', '$'
  10.         Len             dw      $-String
  11.  
  12.         msgInitString   db      'Исходная строка:', 0Dh, 0Ah, '$'
  13.         msgResString    db      'Результирующая строка:', 0Dh, 0Ah, '$'
  14.         CrLf            db      0Dh, 0Ah, '$'
  15.         CountWords      dw      ?       ;общее количество слов
  16. .code
  17.  
  18. main    proc
  19.         mov     ax,     @data
  20.         mov     ds,     ax
  21.  
  22.         mov     ah,     09h
  23.         lea     dx,     msgInitString
  24.         int     21h
  25.         mov     ah,     09h
  26.         lea     dx,     String
  27.         int     21h
  28.         mov     ah,     09h
  29.         lea     dx,     CrLf
  30.         int     21h
  31.  
  32.         lea     si,     String
  33.         mov     cx,     Len
  34.         mov     CountWords,     0
  35.         ;пропускаем все разделители
  36. @@WhileDelimiter:
  37.         mov     al,     [si]
  38.         cmp     al,     DelimChar
  39.         jne     @@NewWord
  40.         inc     si
  41.         loop    @@WhileDelimiter
  42.  
  43.         jcxz    @@Finish        ;если строка закончилась - выйти
  44.         ;найдено новое слово
  45. @@NewWord:
  46.         mov     di,     si      ;di - указатель на начало слова
  47.         inc     CountWords      ;увеличиваем счётчик слов на 1
  48.         ;пропускаем все буквы слова до разделителя
  49. @@WhileWord:
  50.         mov     al,     [si]
  51.         cmp     al,     DelimChar
  52.         je      @@Break
  53.         inc     dx              ;увеличиваем длину слова
  54.         inc     si              ;переходим к следующему символу
  55.         loop    @@WhileWord
  56. @@Break:
  57.         test    CountWords,     1       ;это чётное слово?
  58.         jnz     @@SkipReverse   ;если длина слова больше трёх
  59.  
  60.         push    si
  61.         dec     si              ;si - указатель на последнюю букву слова
  62.         @@ReverseWord:
  63.                 xchg    al,     [si]
  64.                 xchg    al,     [di]
  65.                 xchg    al,     [si]
  66.                 inc     di
  67.                 dec     si
  68.                 cmp     si,     di
  69.                 ja      @@ReverseWord
  70.         pop     si
  71. @@SkipReverse:
  72.         jcxz    @@Finish
  73.         jmp     @@WhileDelimiter
  74.  
  75. @@Finish:
  76.  
  77.         ;вывод результатов
  78.         ;Результирующая строка
  79.         mov     ah,     09h
  80.         lea     dx,     msgResString
  81.         int     21h
  82.         mov     ah,     09h
  83.         lea     dx,     String
  84.         int     21h
  85.         mov     ah,     09h
  86.         lea     dx,     CrLf
  87.         int     21h
  88.  
  89.         ;завершение программы
  90.         mov     ax,     4C00h
  91.         int     21h
  92. main    endp
  93.  
  94. end     main

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

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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

13   голосов , оценка 4.154 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы