Обменять слова с максимальным и минимальным количеством букв «а» - Assembler

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

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

Привет! Выручайте! Необходимо обменять слова с максимальным и минимальным количеством букв "а". Программа вроде работает, но не выводит преобразованную строку. Помогите найти ошибку и исправить
Листинг программы
  1. include "emu8086.inc"
  2. data segment
  3. mas db 30 dup(?),32
  4. smes4 dw ?
  5. adress dw ?
  6. smes42 dw ?
  7. adress2 dw ?
  8. razmernost dw 31
  9. slov1 db 20 dup (?)
  10. slov2 db 20 dup (?)
  11. slov3 db 20 dup (?)
  12. ends
  13. stack segment
  14. dw 128 dup(0)
  15. ends
  16. code segment
  17. start:
  18. ; set segment registers:
  19. mov ax, data
  20. mov ds, ax
  21. mov es, ax
  22. call pthis
  23. Db 'Vvedite stroky: ', 0
  24. mov di,offset mas
  25. mov dx,30
  26. call GET_STRING
  27. ;---max---
  28. mov cx,razmernost
  29. mov si,offset mas
  30. mov di,si
  31. xor dx,dx
  32. xor bx,bx
  33. l1:lodsb
  34. cmp al,97 ; sravnivaem s 'a'
  35. jne l2 ;esli ne ravno
  36. inc dx
  37. l2:cmp al,32 ;sravnivaem s probelom
  38. jne l4 ; esli ne ravno
  39. cmp dx,bx
  40. jl l5 ; esli menshe ili ravno
  41. mov bx,dx
  42. mov adress,di ;nachalo slova max
  43. mov smes4,si
  44. sub smes4,di ;konec slova max
  45. mov di,si
  46. xor dx,dx
  47. jmp l4
  48. l5: mov bx,dx
  49. mov adress2,di ;nachalo slova min
  50. mov smes42,si
  51. sub smes42,di ;konec slova min
  52. l3:mov di,si
  53. xor dx,dx
  54. l4:loop l1
  55. ;----zapis max i min slov v novie massivi
  56. dec adress
  57. xor si, si
  58. mov si, offset mas; nachalo stroki
  59. mov di, offset slov1 ;
  60. mov si, adress ; poz.nachala slova max
  61. mov cx, smes4
  62. rep movsb
  63. dec adress2
  64. xor si, si
  65. mov si, offset mas; nachalo stroki
  66. mov di, offset slov2 ;
  67. mov si, adress2 ; poz.nachala slova max
  68. mov cx, smes42
  69. rep movsb
  70. ;---zapis mezhdu max i min
  71. xor si, si
  72. mov si, offset mas ; nachalo stroki
  73. mov di, offset slov3
  74. mov si, adress
  75. add si, smes4
  76. mov cx, adress2
  77. sub cx, si
  78. push cx
  79. rep movsb
  80. ;---menyaem
  81. xor si, si
  82. xor di, di
  83. mov si, offset slov2
  84. mov di, offset mas
  85. mov cx, smes42
  86. mov di, adress
  87. rep movsb
  88. xor si, si
  89. xor di, di
  90. mov si, offset slov3
  91. mov di, offset mas
  92. mov di, adress
  93. add di, smes42
  94. pop cx
  95. rep movsb
  96. xor si, si
  97. xor di, di
  98. mov si, offset slov1
  99. mov di, offset mas
  100. mov cx, smes4
  101. mov di, adress2
  102. rep movsb
  103. ; ---vivod
  104. mov si,razmernost
  105. sub si,smes4
  106. sub si,2
  107. mov mas[si],0
  108. call pthis
  109. Db 13, 10, 'slovomax: ', 0
  110. mov si,offset slov1
  111. call PRINT_STRING
  112. mov si,razmernost
  113. sub si,smes42
  114. sub si,2
  115. mov mas[si],0
  116. call pthis
  117. Db 13, 10, 'slovomin: ', 0
  118. mov si,offset slov2
  119. call PRINT_STRING
  120. call pthis
  121. Db 13, 10, 'slovo3: ', 0
  122. mov si,offset slov3
  123. call PRINT_STRING
  124. mov si,razmernost
  125. mov cx, razmernost
  126. mov mas[si],0
  127. call pthis
  128. Db 13, 10, 'newmas: ', 0
  129. mov si,offset mas
  130. call PRINT_STRING
  131. mov ah, 1
  132. int 21h
  133. mov ax, 4c00h ; exit to operating system.
  134. int 21h
  135. ends
  136. DEFINE_PRINT_STRING
  137. DEFINE_GET_STRING
  138. DEFINE_PTHIS
  139. end start ; set entry point and stop the assembler.

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

textual
Листинг программы
  1. LOCALS
  2.  
  3. .model small
  4.  
  5. .stack 100h
  6.  
  7. .data
  8.         CrLf    db      0Dh, 0Ah, '$'
  9.         Source  db      'Abbb '
  10.         Min     db      'def '
  11.                 db      'AAgg '
  12.                 db      'AAhh AAjj '
  13.         Max     db      'AAAkkkkk'
  14.                 db      ' AAllmm', '$'
  15.         Len     equ     $-Source-1
  16.         Dest    db      255 dup('$')
  17.  
  18.         Imin    dw      Min-Source      ;отсчёт от 0
  19.         Lmin    dw      3
  20.         Imax    dw      Max-Source      ;отсчёт от 0
  21.         Lmax    dw      8
  22. .code
  23.  
  24. main    proc
  25.         mov     ax,     @data
  26.         mov     ds,     ax
  27.  
  28.         mov     ax,     ds
  29.         mov     es,     ax
  30.  
  31.         lea     si,     Source
  32.         mov     bx,     si
  33.         lea     di,     Dest
  34.         cld
  35.         ;1.Из исходной строки копировать в буферную (Imin-1) символ.
  36. @@Item1:
  37.         mov     cx,     Imin
  38.         jcxz    @@Item2
  39.         rep     movsb
  40.  
  41.         ;2.Копировать Lmax символов с индекса Imax
  42. @@Item2:
  43.         mov     cx,     Lmax
  44.         jcxz    @@Item3
  45.         mov     si,     bx
  46.         add     si,     Imax
  47.         rep     movsb
  48.  
  49.         ;3.Копировать (Imax-Imin-Lmin) символов с индекса (Imin+Lmin)
  50. @@Item3:
  51.         mov     cx,     Imax
  52.         sub     cx,     Imin
  53.         sub     cx,     Lmin
  54.         jcxz    @@Item4
  55.         mov     si,     bx
  56.         add     si,     Imin
  57.         add     si,     Lmin
  58.         rep     movsb
  59.  
  60.         ;4.Копировать Lmin символов с индекса Imin
  61. @@Item4:
  62.         mov     cx,     Lmin
  63.         mov     si,     bx
  64.         add     si,     Imin
  65.         jcxz    @@Item5
  66.         rep     movsb
  67.  
  68.         ;5.Копировать оставшиеся символы.
  69. @@Item5:
  70.         mov     cx,     Len
  71.         sub     cx,     Imax
  72.         sub     cx,     Lmax
  73.         jcxz    @@Item6
  74.         mov     si,     bx
  75.         add     si,     Imax
  76.         add     si,     Lmax
  77.         rep     movsb
  78.  
  79. @@Item6:
  80.         jmp     @@Exit
  81.  
  82.  
  83. @@Exit:
  84.  
  85.         mov     ah,     09h
  86.         lea     dx,     Source
  87.         int     21h
  88.         mov     ah,     09h
  89.         lea     dx,     CrLf
  90.         int     21h
  91.         mov     ah,     09h
  92.         lea     dx,     Dest
  93.         int     21h
  94.  
  95.  
  96.  
  97.         mov     ax,     4C00h
  98.         int     21h
  99. main    endp
  100.  
  101. end     main

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

  1. Объявление и инициализация переменных:
    • CrLf - переменная, содержащая символы возврата каретки и переноса строки
    • Source - исходная строка Abbb
    • Min - строка с минимальным количеством букв а
    • Max - строка с максимальным количеством букв а
    • Len - переменная, содержащая длину строки исходной строки Source
    • Dest - буфер для результирующей строки
    • Imin - переменная, содержащая позицию (отсчет от 0) минимальной строки в исходной строке Source
    • Lmin - переменная, содержащая длину минимальной строки
    • Imax - переменная, содержащая позицию (отсчет от 0) максимальной строки в исходной строке Source
    • Lmax - переменная, содержащая длину максимальной строки
  2. Копирование символов:
    • Начало цикла итераций. В цикле происходит копирование символов из исходной строки в буферную для строк до минимальной строки.
    • После копирования символов, происходит копирование символов из исходной строки в буферную для строк от максимальной строки.
    • Копирование оставшихся символов.
  3. Вывод результатов:
    • Используя прерывание 21h, вывод на экран символов исходной строки, переноса строки и символов буферной строки.
    • Завершение программы. Код выполняет перестановку строк исходной строки Source в буферную строку Dest, меняя местами строки с минимальным и максимальным количеством букв а.

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


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

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

10   голосов , оценка 4.2 из 5

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

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

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