Вывести из строки все слова с заданным символом (Tasm) - Assembler

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

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

Помогите, пожалуйста, отредактировать код. Условие задачи: ввести строку, ввести символ. Вывести все слова с данным символом. Прога выводит строку "Input", принимает сначала строку, потом символ и виснет.
Листинг программы
  1. .model small
  2. .286
  3. .stack 100h
  4. .386
  5. .data
  6. size_buf db 255
  7. size_real db 255
  8. string db 254 dup ('$')
  9. newstr dw 53 dup ('$')
  10. i dw 0
  11. char db ?
  12. space db ' '
  13. ent db 10, 13, '$'
  14. newpos dw 0
  15. pos dw 0
  16. tmp dw ?
  17. message1 db "Input: $"
  18. ok db 0
  19. .code
  20. ENTER_PR proc
  21. push dx
  22. push ax
  23. lea dx, ent;
  24. mov ah, 09h
  25. int 21h
  26. pop ax
  27. pop dx
  28. ret
  29. endp ENTER_PR
  30.  
  31. start:
  32. mov ax, @data
  33. mov ds, ax
  34. ;Вывод приглашения сделать вывод
  35. xor dx,dx
  36. mov DX,offset message1
  37. mov ah, 09h
  38. int 21h
  39. call ENTER_PR
  40.  
  41. ;настроиться на str и считать строку
  42. lea dx, size_buf
  43. mov ah, 0Ah; считать строчку
  44. int 21h
  45. call ENTER_PR
  46. ;символ
  47. mov ah,01h
  48. int 21h
  49. mov char,al
  50. call ENTER_PR
  51. xor si,si
  52. lea si,string
  53. add si, 2 ;свдинулись на две ячейки вправо
  54. mov pos,si позицию загоняем начальный адрес строки
  55. cycle:
  56. mov cx, '$'
  57. cmp i,cx ;сравниваем на конец строки
  58. jae final ;если больше или равно мы идем на конец
  59. mov al,[si] ; ;перемещаем в аl первое значение по адресу
  60. cmp al,char ;сравниваем с символом
  61. jne second_cond ;если не равно, мы перескикиваем
  62. mov ok, 1 ;все ок
  63. second_cond:
  64. mov al,[si] ;записываем значение по адресу
  65. cmp al,space ;сравниваем с пробелом
  66. jne move ;не равно
  67. lea ax, ok
  68. cmp ax, 1
  69. jne ok_false
  70. lea di, string
  71. add di, 2
  72. add di, pos ;прибавляем позицию того слова, что содержит наш символ
  73. lea bx, newstr
  74. add bx, 1 ;фактическая длина строки
  75. while1:
  76. mov ax, i
  77. cmp pos, ax
  78. jle end_while1 ; не больше/меньше или равно
  79. mov dl, byte ptr [di]
  80. mov byte ptr [bx], dl ;присваиваем символ одной строки, символу другой строки
  81. inc di
  82. inc bx
  83. inc pos
  84. jmp while1
  85. end_while1: inc bx ;добавляем новой строке пробел
  86. lea bx, space
  87. mov newpos, bx
  88. ok_false:
  89. mov ok, 0
  90. mov ax, i
  91. mov pos, ax
  92. jmp move
  93. move: inc i
  94. inc si
  95. jmp cycle
  96. final:
  97. call ENTER_PR
  98. mov si,offset newstr
  99. int 21h
  100. mov ah, 4Ch
  101. int 21h
  102. end start

Решение задачи: «Вывести из строки все слова с заданным символом (Tasm)»

textual
Листинг программы
  1. ;***************************************************************************;
  2. ;                               StrOutputWGC                                ;
  3. ;***************************************************************************;
  4. ;                                                                           ;
  5. ; Description:                                                              ;
  6. ;  The program takes a string, takes the character. Displays all words with ;
  7. ;  a given character.                                                       ;
  8. ;                                                                           ;
  9. ; Target OS:                                                                ;
  10. ;  MS-DOS (or in DOSBox, or else where).                                    ;
  11. ;                                                                           ;
  12. ; The code was written by XiloManX.                                         ;
  13. ; Created specially for [url]http://www.cyberforum.ru[/url].                           ;
  14. ; Compile with FASM v1.71.54.                                               ;
  15. ;                                                                           ;
  16. ; Rights of copying: is free.                                               ;
  17. ;                                                                           ;
  18. ; Date:                                                                     ;
  19. ;  30.10.2016                                                               ;
  20. ;                                                                           ;
  21. ;***************************************************************************;
  22.  
  23. ;***************************************************************************;
  24. ;     *** HEAD AREA ***                                                     ;
  25. ;***************************************************************************;
  26.  
  27. format MZ
  28.  
  29. entry main:start            ; точка входа в программу.
  30. stack 100h                  ; размер стека.
  31.  
  32. ;***************************************************************************;
  33. ;     *** CONSTANTS AREA ***                                                ;
  34. ;***************************************************************************;
  35.  
  36. lf    equ 10       ; line feed.
  37. cr    equ 13       ; carette return.
  38. crlf  equ cr, lf   ; carette return and line feed.
  39.  
  40. ;***************************************************************************;
  41. ;     *** DATA AREA ***                                                     ;
  42. ;***************************************************************************;
  43.  
  44. segment text
  45.  
  46. author_message  db  crlf, 'Written specially for [url]www.Cyberforum.ru[/url] by XiloManX.', crlf, crlf
  47. author_message.length = $ - author_message
  48.  
  49. message:
  50.  .crlf              db  cr, lf, '$'
  51.  .for_input_line    db  'Enter line: '
  52.  .for_input_char    db  'Enter char: '
  53.  .for_output_line   db  'Result: '
  54.  .for_notification  db  'Press any key to exit ...$'
  55.  
  56. buffer:
  57.  .for_input_line    db  252, 0, 255 dup ('$')
  58.  .for_output_line   db  255 dup ('$')
  59.  .for_char          db  0
  60.  
  61.   src_pos           dw 0
  62.   dst_pos           dw 0
  63.  
  64. ;***************************************************************************;
  65. ;     *** CODE AREA ***                                                     ;
  66. ;***************************************************************************;
  67.  
  68. segment main
  69.  
  70. start:
  71.         ; копируем адрес сегмента данных в сег. регистры ds и es.
  72.         mov        ax, text
  73.         mov        ds, ax
  74.         mov        es, ax
  75.         ; печатаем сообщение автора на экране.
  76.         call       extra:print_author_message
  77.         ; выводим приглашение сделать ввод строки.
  78.         mov        cx, 12
  79.         mov        bp, message.for_input_line
  80.         mov        bx, 0eh ; attribute
  81.         call       extra:print_text1
  82.         ; переводим курсор на новую строку.
  83.         call       extra:print_crlf
  84.    read_line:
  85.         ; считываем строку.
  86.         push       dx
  87.         mov        ah, 0ah
  88.         mov        dx, buffer.for_input_line
  89.         int        21h
  90.         pop        dx
  91.         ; проверим, был ли сделан ввод строки.
  92.         cmp        [buffer.for_input_line+1], byte 1
  93.         jle        read_line
  94.         ; переводим курсор на новую строку.
  95.         call       extra:print_crlf
  96.         ; спускаем курсор на 2 ряда вниз.
  97.         add        dh, 2
  98.         xor        dl, dl
  99.         ; выводим приглашение сделать ввод символа.
  100.         mov        cx, 12
  101.         mov        bp, message.for_input_char
  102.         mov        bx, 0eh ; attribute
  103.         call       extra:print_text1
  104.         ; переводим курсор на новую строку.
  105.         call       extra:print_crlf
  106.    read_char:
  107.         ; считываем символ.
  108.         mov        ah, 01h
  109.         int        21h
  110.         ; проверим, был ли сделан ввод символа.
  111.         cmp        al, byte 13
  112.         je         read_char
  113.         cmp        al, byte '$'
  114.         jne        @f
  115.         ; удаляем символ '$' и возвращаем курсор обратно.
  116.     mov        ax, 13 ; cr.
  117.     int        29h
  118.     mov        ax, ' '
  119.     int        29h
  120.     mov        ax, 13 ; cr.
  121.     int        29h
  122.         jmp        read_char
  123.      @@:
  124.         ; сохраняем символ в буфер.
  125.         mov        [buffer.for_char], al
  126.         ; переводим курсор на новую строку.
  127.         call       extra:print_crlf
  128.         ; инициализируем bx, адресом буфера со строкой.
  129.         lea        bx, [buffer.for_input_line+2]
  130.         ; инициализируем dst_pos, адресом буфера назначения.
  131.         push       buffer.for_output_line
  132.         pop        [dst_pos]
  133.  
  134.     ; пропускаем пробел(ы).
  135.     pass_space:
  136.         cmp        [bx], byte '$'
  137.         je         final
  138.         cmp        [bx], byte ' '
  139.         jne        save_start_addr
  140.         inc        bx      
  141.         jmp        pass_space
  142.     ; сохраняем начальный адрес введёной строки.
  143.     save_start_addr:
  144.         mov        [src_pos], bx
  145.     ; ищим символ в слове.
  146.     seek_char:
  147.         cmp        [bx], byte '$'
  148.         je         final
  149.         cmp        [bx], byte ' '
  150.         je         pass_space
  151.         mov        al, [buffer.for_char]  
  152.         cmp        [bx], al ; сравниваем с символом.
  153.         je         count_chars
  154.         inc        bx      
  155.         jmp        seek_char
  156.    ; подсчитываем число символов в найдденом слове.
  157.    count_chars:
  158.         mov        bx, [src_pos]
  159.         xor        cx, cx
  160.      .cycle:
  161.         cmp        [bx], byte '$'
  162.         je         copy_chars
  163.         cmp        [bx], byte ' '
  164.         je         copy_chars
  165.         inc        cl
  166.         inc        bx      
  167.         jmp        .cycle
  168.     ; копируем слово в буфер.
  169.     copy_chars:
  170.         mov        si, [src_pos]
  171.         mov        di, [dst_pos]
  172.         inc        cl
  173.         rep        movsb
  174.         dec        si  
  175.         mov        bx, si
  176.         mov        [dst_pos], di  
  177.         jmp        pass_space
  178.  
  179.  
  180. final:
  181.         ; сохраняем символ конца строки.
  182.         mov        [di-1], byte '$'
  183.         ; переводим курсор на новую строку.
  184.         call       extra:print_crlf
  185.         ; спускаем курсор на 3 ряда вниз.
  186.         add        dh, 3
  187.         xor        dl, dl
  188.         ; выводим сообщение.
  189.         mov        cx, 8
  190.         mov        bp, message.for_output_line
  191.         mov        bx, 0ch ; цвет.
  192.         call       extra:print_text1
  193.         ; переводим курсор на новую строку.
  194.         call       extra:print_crlf
  195.         ; выводим строку.
  196.         mov        dx, buffer.for_output_line
  197.         call       extra:print_text2
  198.         ; переводим курсор на новую строку.
  199.         call       extra:print_crlf
  200.         ; переводим курсор на новую строку.
  201.         call       extra:print_crlf  
  202.         ; выводим сообщение.
  203.         mov        dx, message.for_notification
  204.         call       extra:print_text2
  205.         ; делаем паузу.
  206.         mov        ah, 01h
  207.         int        21h
  208.         ; выходим из программы.
  209.         mov        ah, 4Ch
  210.         int        21h
  211.  
  212. ;***************************************************************************;
  213. ;     *** PROCEDURE AREA ***                                                ;
  214. ;***************************************************************************;
  215.  
  216. segment extra
  217.  
  218. print_author_message:
  219.         mov        bx, 0Ah     ; attribute.
  220.         xor        dx, dx      ; cur pos.
  221.         mov        cx, author_message.length
  222.         mov        bp, author_message
  223. ; функция вывода текста на экран.
  224. print_text1:
  225.         mov        ax, 1301h   ; bit 1 - updare cursor.
  226.         int        10h
  227.         retf
  228. ; функция вывода текста на экран.
  229. print_text2:
  230.         mov        ah, 09h
  231.         int        21h
  232.         retf
  233. ; функция перевода курсора на новую строку.
  234. print_crlf:
  235.         mov        al, 13           ; CR.
  236.         int        29h
  237.         mov        al, 10           ; LF.
  238.         int        29h
  239.         retf

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


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

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

8   голосов , оценка 4.125 из 5

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

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

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