Последовательности символов, входящих в строку и расположенных в алфавитном или обратном алфавитному порядках - Assembler

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

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

Вывести на экран последовательности символов, входящих в строку и расположенных в алфавитном или обратном алфавитному порядках. Длина минимальной такой последовательности – 3 символа. Каждую имеющуюся последовательность выводить на экран с новой строки. Мой код в спойлере. Ошибка заключается в том, что в обратном алфавитном порядке выводит немного неправильно. Помогите исправить.
Листинг программы
  1. .DATA
  2. String_1 db 40 dup(20h)
  3. String_2 db 40 dup(20h)
  4. Index_H dw 0000h
  5. Buffer dw 0000h
  6. Index_L dw 0000h
  7. In_Put db "Vvedite stroku, sostojawuu iz bukv v kolichesve ot 30 do 40 sivolov:",0Dh,0Ah,"$"
  8. Symbol_Bad_s db 0Dh,0Ah,"Vvedenno malo simvolov$"
  9. Clear db 62 dup(20h),"$"
  10. Enter db 0Dh,0Ah,"$"
  11. V_p db 0Dh,0Ah,"V Prjamom porjadke:","$"
  12. O_p db 0Dh,0Ah,"V Obratnom porjadke:","$"
  13. N_p db 0Dh,0Ah,"Elementy udovl. poisku otsutstvujut","$"
  14. Konec db 0Dh,0Ah,"Konec. Click ENTER","$"
  15. Count dw 0000h
  16. .STACK 256
  17. .CODE
  18. start:
  19. mov AX,@DATA
  20. mov DS,AX
  21. mov ES,AX
  22. mov DI,offset String_1
  23. mov DX,offset In_Put
  24. mov AH,09h
  25. int 21h
  26. mov CX,40
  27. InPut_Data:
  28. xor AH,AH ; Chtenie nagatoj klavishi
  29. int 16h
  30. cmp AL,0Dh ; Natat li ENTER?
  31. jz Symbol_Bad
  32. ; Proverka diapozona
  33. cmp AL,7Bh
  34. lahf
  35. not AH
  36. xchg AH,DH
  37. cmp AL,61h
  38. lahf
  39. or AH,DH
  40. sahf
  41. jns Indi ; Esli vvedennyje dannye in[a..z]
  42. cmp AL,5Bh
  43. lahf
  44. not AH
  45. xchg AH,DH
  46. cmp AL,41h
  47. lahf
  48. or AH,DH
  49. sahf
  50. jns Indi ; Esli vvedennyje dannye in[A..Z]
  51. ; Vyvod oshibki na ekran
  52. Symbol_Bad_PP:
  53. push CX
  54. mov AH,03h ; Nahojdenie pozicii kursora
  55. int 10h
  56. push DX
  57. mov DX,offset Symbol_Bad_s ; vyvod stroki oshibki
  58. mov AH,09h
  59. int 21h
  60. exit:
  61. xor AH,AH ; [AH=00h\ INT 16h] ==> ctenie najatpj klavishi
  62. int 16h
  63. cmp AL,0Dh ; Zaderjka do najatija Enter
  64. jnz exit
  65. mov AH,02h ; Peremeshenie kursora na nachalo stroki
  66. mov DX,0200h
  67. int 10h
  68. mov DX,offset Clear ; Ochistka stroki oshibki
  69. mov AH,09h
  70. int 21h
  71. pop DX ; Peremeshenie kursora na konec vvedennoj stroki
  72. mov AH,02h
  73. int 10h
  74. pop CX
  75. inc AH
  76. jmp Symbol_Bad
  77. Indi:
  78. mov AH,0Eh ; Vyvod vvedennoj stroki na ekran (Teletayp)
  79. int 10h
  80. stosb ; Zagruzka v stroku vvedennogo simvola
  81. inc Count
  82. Symbol_Bad:
  83. cmp Count,30
  84. jle InPut_Data
  85. cmp Count, 40
  86. jz Next
  87. cmp AL,0Dh
  88. jnz InPut_Data
  89. next:
  90. mov SI,offset String_1
  91. mov DI,offset String_2
  92. mov CX,Count
  93. Write:
  94. lodsb
  95. cmp AL,61h
  96. jae small ; big_Let ==> small_Let
  97. add AL,20h
  98. small:
  99. stosb
  100. loop Write
  101. mov SI,offset String_2 ; Zagruzka adresa pervogo simvola
  102. mov DI,offset String_2+1 ; Zagruzka adresa vtorogo simvola
  103. mov CX,Count
  104. cld
  105. mov DX,offset V_p
  106. mov AH,09h
  107. int 21h
  108. loads:
  109. lodsb ;AL,[SI] ; Poisk posledovatelnosni iz 2 simvolov v alfov. porjadke
  110. inc AL
  111. scasb ;[DI+1];AL
  112. loopnz loads
  113. xor CX,0
  114. jz exit_
  115. mov Index_L,SI ; Sohranenie pervogo elementa v alfov. porjadke
  116. re_loads: ; poisk poslednego elementa v alfov porjadke
  117. lodsb
  118. inc AL
  119. scasb
  120. loopz re_loads
  121. mov Index_H,SI ; Sohranenie adresa poslednego elementa
  122. mov Buffer,SI
  123. sub SI,Index_L
  124. cmp SI,2 ; kol-vo simvolov v alfov. porjadke
  125. jb prov ; Proverka (ne menee 3 simvolov)
  126. mov DX,offset Enter
  127. mov AH,09h
  128. int 21h
  129. push CX
  130. inc SI
  131. mov CX,SI
  132. mov AH,0Eh
  133. mov SI,Index_L
  134. sub SI,41
  135. write_skrin:
  136. lodsb ; vyvedenie simvolov
  137. int 10h
  138. loop write_skrin
  139. pop CX
  140. prov:
  141. mov SI,Index_H
  142. xor CX,0
  143. jnz loads
  144. exit_:
  145. xor Index_L,0
  146. jnz indicir
  147. mov DX,offset N_p ; esli net elementov, udovletvor. poisku
  148. mov AH,09h
  149. int 21h
  150. indicir:
  151. mov Index_H,0 ; Obnulenie Index_H
  152. mov SI,offset String_2-1 ; Zagruzka adresa poslednego elementa
  153. add SI,Count
  154. mov DI,SI
  155. dec DI
  156. mov CX,Count
  157. std
  158.  
  159. ; V obratnom porjadke:
  160. mov DX,offset O_p
  161. mov AH,09h
  162. int 21h
  163. loads_:
  164. lodsb ;AL,[SI]
  165. inc AL
  166. scasb ;[DI+1];AL
  167. loopnz loads_
  168. xor CX,0
  169. jz exit__
  170. mov Index_H,SI
  171. inc Index_H
  172. re_loads_:
  173. lodsb
  174. inc AL
  175. scasb
  176. loopz re_loads_
  177. mov Index_L,SI
  178. mov Buffer,SI
  179. mov SI,Index_H
  180. sub SI,Index_L
  181. cmp SI,3
  182. jb prov_
  183. mov DX,offset Enter
  184. mov AH,09h
  185. int 21h
  186. push CX
  187. mov CX,SI
  188. mov AH,0Eh
  189. mov SI,Index_H
  190. sub Si,40
  191. write_skrin_:
  192. lodsb
  193. int 10h
  194. loop write_skrin_
  195. pop CX
  196. prov_:
  197. mov SI,Buffer
  198. xor CX,0
  199. jnz loads_
  200. exit__:
  201. xor Index_H,0
  202. jnz indicir_
  203. mov DX,offset N_p
  204. mov AH,09h
  205. int 21h
  206. indicir_:
  207. mov DX,offset Konec
  208. mov AH,09h
  209. int 21h
  210. _exit:
  211. xor AH,AH
  212. int 16h
  213. cmp AL,0Dh
  214. jnz _exit
  215. mov AX,4C00h
  216. int 21h
  217. end start
  218. ends

Решение задачи: «Последовательности символов, входящих в строку и расположенных в алфавитном или обратном алфавитному порядках»

textual
Листинг программы
  1. .model small
  2. .data
  3.     InpBuff db  30, 0, 30 dup ('$')
  4.     Kol db  "Введите строку: ",'$'
  5.     Vpyam   db  "По возрастанию: ","$"  
  6.     vobr    db  "По убыванию: ","$"
  7.  
  8. .stack  256
  9.  
  10. newstr  macro
  11.     call    DispCrLf
  12.     endm
  13. dosstr  macro   aStr:REQ
  14.     mov dx, offset aStr
  15.     call    DispDt
  16.     endm
  17.  
  18. .code
  19. start   PROC    NEAR
  20.     mov ax, @data
  21.     mov ds, ax
  22.     mov es, ax      
  23.  
  24.     dosstr  Kol
  25.     newstr
  26.     lea dx, InpBuff
  27.     mov ah, 0ah
  28.     int 21h
  29.     newstr
  30.    
  31.     dosstr  vpyam
  32.     newstr
  33.  
  34.     xor cx, cx
  35.     mov si, offset InpBuff+2
  36.     mov di, offset IsDirSeq
  37.     mov cl, [si-1]
  38.     call    SearchSequence
  39.  
  40.     dosstr  vobr
  41.     newstr
  42.  
  43.     mov di, offset IsRevSeq
  44.     call    SearchSequence
  45. @@exit:
  46.     mov ax, 4c00h ; exit to operating system.
  47.     int 21h        
  48. start   ENDP
  49. ;---------------------------
  50. SearchSequence  PROC    NEAR
  51. ; OnEnter:
  52. ;   DS:SI-> string where look for sequence
  53. ;   CX=StrLength
  54. ;   CS:DI-> seearch sequence subrouting
  55. ; OnExit:
  56. ;   AX=seqence length
  57.     push    ax
  58.     push    cx
  59.     push    si
  60. @@loop:
  61.     call    di
  62.     test    ax, ax
  63.     jz  @@end_of_str
  64.     cmp ax, 3
  65.     jb  @@2next
  66.     call    OutStrLen
  67.     call    DispCrLf
  68. @@2next:
  69.     add si, ax
  70.     sub cx, ax
  71.     jnz @@loop
  72. @@end_of_str:
  73.     pop si
  74.     pop cx
  75.     pop ax
  76.     ret
  77. SearchSequence  ENDP
  78. ;---------------------------
  79. IsDirSeq    PROC    NEAR
  80. ; OnEnter:
  81. ;   DS:SI-> string where look for sequence
  82. ;   CX=StrLength
  83. ; OnExit:
  84. ;   AX=seqence length
  85. ;
  86.     push    cx
  87.     push    dx  ; seq cnt
  88.     push    si
  89.     xor dx, dx
  90.     jcxz    @@exit
  91.     cld
  92.     inc dx
  93.     lodsb
  94.     dec cx
  95.     jz  @@exit
  96. @@loop:
  97.     inc al
  98.     mov ah, al
  99.     lodsb
  100.     cmp al, ah
  101.     jne @@exit
  102.     inc dx
  103.     dec cx
  104.     jnz @@loop
  105. @@exit:
  106.     mov ax, dx
  107.     pop si
  108.     pop dx
  109.     pop cx
  110.     ret
  111. IsDirSeq    ENDP
  112. ;---------------------------
  113. IsRevSeq    PROC    NEAR
  114. ; OnEnter:
  115. ;   DS:SI-> string where look for sequence
  116. ;   CX=StrLength
  117. ; OnExit:
  118. ;   AX=seqence length
  119. ;
  120.     push    cx
  121.     push    dx  ; seq cnt
  122.     push    si
  123.     xor dx, dx
  124.     jcxz    @@exit
  125.     cld
  126.     inc dx
  127.     lodsb
  128.     dec cx
  129.     jz  @@exit
  130. @@loop:
  131.     dec al
  132.     mov ah, al
  133.     lodsb
  134.     cmp al, ah
  135.     jne @@exit
  136.     inc dx
  137.     dec cx
  138.     jnz @@loop
  139. @@exit:
  140.     mov ax, dx
  141.     pop si
  142.     pop dx
  143.     pop cx
  144.     ret
  145. IsRevSeq    ENDP
  146. ;---------------------------
  147. OutStrLen   PROC    NEAR
  148. ; OnEnter:
  149. ;   DS:SI -> str to display
  150. ;   AX -> str length
  151.     push    ax
  152.     push    cx
  153.     push    dx
  154.     push    si
  155.  
  156.     mov cx, ax
  157.     cld
  158.     jcxz    @@exit
  159. @@loop:
  160.     lodsb
  161.     mov ah, 2
  162.     mov dl, al
  163.     int 21h
  164.     loop    @@loop
  165.  
  166. @@exit:
  167.     pop si
  168.     pop dx
  169.     pop cx
  170.     pop ax
  171.     ret
  172. OutStrLen   ENDP
  173. ;---------------------------
  174. DispCrLf    PROC    NEAR
  175.     push    ax
  176.     push    dx
  177.     mov dl, 0dh
  178.     mov ah, 2
  179.     int 21h
  180.     mov dl, 0ah
  181.     mov ah, 2
  182.     int 21h
  183.     pop dx
  184.     pop ax
  185.     ret
  186. DispCrLf    ENDP
  187. ;---------------------------
  188. DispDt  PROC    NEAR
  189.     push    ax
  190.     mov ah, 9
  191.     int 21h
  192.     pop ax
  193.     ret
  194. DispDt  ENDP
  195. ;---------------------------
  196.     end start

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

  1. Объявление модели small и переменных:
    • InpBuff - массив символов размером 30 байт, инициализированный нулями
    • Kol - строка Введите строку:
    • Vpyam - строка По возрастанию:
    • vobr - строка По убыванию:
  2. Инициализация стека размером 256
  3. Макросы:
    • newstr - вызов процедуры для пустой строки
    • dosstr - подготовка аргумента, вывод на экран и переход на новую строку
  4. Процедура start:
    • Инициализация регистров ax, ds, es
    • Вывод строки Введите строку:
    • Ввод строки с помощью прерывания int 21h
    • Вывод строк По возрастанию:
    • Вызов процедуры SearchSequence для поиска последовательности по возрастанию
    • Вывод строк По убыванию:
    • Вызов процедуры SearchSequence для поиска последовательности по убыванию
    • Завершение программы с помощью прерывания int 21h
  5. Процедура SearchSequence:
    • Поиск последовательности символов во входной строке в алфавитном или обратном алфавитном порядке
  6. Процедуры IsDirSeq и IsRevSeq:
    • Подпрограммы для поиска последовательности символов по возрастанию и по убыванию
  7. Процедура OutStrLen:
    • Вывод длины строки на экран
  8. Процедуры DispCrLf и DispDt:
    • Вывод комбинации возврата каретки и перехода на новую строку
    • Вывод строки на экран Этот код написан на языке Assembler, и он отвечает за ввод строки, поиск последовательности символов в алфавитном и обратном алфавитном порядках в этой строке, и вывод результатов на экран.

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


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

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

11   голосов , оценка 4.364 из 5

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

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

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