Обработка строковых данных. Поменять местами два слова (tasm) - Assembler

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

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

Все слова в предложении имеют одинаковую длину. Заданы два целых положительных числа А и В. Это номера слов в предложении. Поменять местами эти два слова. Если, хотя бы одного слова с номером А или В нет, то сообщить об этом. Помогите со сменой кода под задание в "индивидуальная часть программы". Спасибо.
Листинг программы
  1. DSEG SEGMENT
  2. ; индивидуальные данные - начало
  3. k DW ?
  4. j DW ?
  5. A DB 'р'
  6. N DW ?
  7. POLE DB 20 dup(?),'$'
  8. PRT3 DB 'номер слова -'
  9. BUFFER1 DB 6 dup(?)
  10. DB 10,13,'$'
  11. ; индивидуальные данные - конец
  12. USER_STRING DB 100,101 dup(?)
  13. TEXT1BW DB 'нет точки или ? или !',10,13,'$'
  14. TEXT2BW DB 'неверный символ -'
  15. SYMBW DB ?
  16. DB ', его номер -'
  17. buffer2 DB 6 dup(?)
  18. DB 10,13,'$'
  19. BWC DB ?
  20. symb db ' ,:-.!?'
  21. stroka DB 100 dup(?)
  22. DB 10,13,'$'
  23. prt1 DB 'введите предложение:',10,13,'$'
  24. prt2 DB 10,13,'ввели предложение:',10,13,'$'
  25. Prob db ' $'
  26. NEW_LINE db 13,10,'$' ;перевод строки
  27. Buffer db 6 dup (?),'$'
  28. DSEG ENDS
  29. Stacks segment
  30. dw 140 dup (?)
  31. Stacks ends
  32. CODES SEGMENT
  33. MAIN PROC FAR
  34. Assume CS:codes, DS:dseg, SS:stacks,ES:dseg
  35. Mov AX,Dseg
  36. Mov DS,AX
  37. mov ES,AX
  38. CLD
  39. LEA DX,prt1
  40. Call PRT ;печать 'введите предложение: '
  41. lea DI,STROKA ; очистили STROKA
  42. mov CX,100
  43. call CLEAR_STR
  44. CALL READ_KEYS ; ввели предложение в USER_STRING
  45. lea DI,STROKA
  46. mov SI,DX
  47. REP movsb ; переписали предложение в STROKA
  48. lea DX,PRT2
  49. call prt
  50. lea DX,stroka
  51. call prt
  52.  
  53. ;*******************************************************************************
  54. ; индивидуальная часть программы - начало
  55. ; пусть i - BX
  56. mov N,1
  57. lea BX,STROKA
  58. BL5:
  59. mov k,BX
  60. call END_WORD
  61. mov j,BX
  62. mov SI,k
  63. mov AH,A
  64. cmp byte ptr[SI],AH
  65. je BL8
  66. jmp BL12
  67. BL8:
  68. lea DI,POLE ; очистка POLE
  69. mov CX,20
  70. call CLEAR_STR
  71. ; перепись слова в POLE
  72. mov CX,BX ; подсчет длины слова
  73. sub CX,SI
  74. inc CX
  75. lea DI,POLE
  76. REP movsb
  77. ; печать слова
  78. lea DX,POLE
  79. call PRT
  80. push BX
  81. mov AX,N
  82. lea BX,BUFFER1
  83. call convba
  84. pop BX
  85. lea DX,PRT3
  86. call PRT
  87. call NL
  88. BL12:
  89. inc N
  90. call BEG_WORD
  91. cmp BWC,0
  92. je BL5
  93. FIN:
  94. ; индивидуальная часть программы - конец
  95. ;*******************************************************************************
  96.  
  97. Mov AH,4CH
  98. Int 21h
  99. MAIN ENDP
  100. ;*********************************************************
  101. CLEAR_STR proc ;процедура очистки поля
  102. ;адрес начала очищаемого поля в DI, количество символов в CX
  103. push AX
  104. push DI
  105. push CX
  106. mov AL,' '
  107. REP STOSB
  108. pop CX
  109. pop DI
  110. pop AX
  111. RET
  112. CLEAR_STR ENDP
  113. ;*********************************************************
  114. CONVBA PROC ; процедура преобразования числа в строку ASCII-кода.
  115. CONVBA endp
  116. ;*********************************************************
  117. PRT PROC ; процедура печати текста
  118. PRT ENDP
  119. ;*********************************************************
  120. PRN PROC ;процедура печати числа
  121. RET
  122. PRN ENDP
  123. ;********************************************************
  124. NL proc ; процедура перевода строки
  125. NL endp
  126. ;*******************************************************
  127. READ_KEYS proc ; процедура ввода строки в поле USER_STRING.
  128. READ_KEYS endp
  129. ;*********************************************************
  130. END_WORD proc
  131. push SI
  132. push AX
  133. xor CX,CX
  134. BEGEW:
  135. push CX
  136. mov CX,7
  137. Lea SI,SYMB
  138. COMP:
  139. MOV AH,[SI]
  140. CMP AH,[BX]
  141. JE FINEW
  142. INC SI
  143. LOOP COMP
  144. pop CX
  145. inc BX
  146. inc CX
  147. JMP BEGEW
  148. FINEW:
  149. pop CX
  150. dec BX
  151. pop AX
  152. pop SI
  153. RET
  154. END_WORD ENDP
  155. ;*******************************************************
  156. BEG_WORD proc
  157. push DX
  158. push AX
  159. lea DX,STROKA
  160. add DX,100
  161. mov BWC,0
  162. inc BX ; переход на следующий символ после последнего в слове
  163. mov AL,[BX]
  164. cmp AL,'?' ; сравнение символа с '?' либо '!' либо '.'
  165. je KONBW ; конец предложения
  166. cmp AL,'!'
  167. je KONBW
  168. cmp AL,'.'
  169. je KONBW
  170. cmp AL,' ' ; сравнение с пробелом
  171. je PROBBW
  172. cmp AL,',' ; сравнение с ,
  173. je GOPROBBW ; если запятая, то проверить наличие далее пробелов
  174. cmp AL,'-' ; сравнение с -
  175. ; остается только символ :
  176. GOPROBBW:
  177. inc BX ; следующим должен быть пробел
  178. cmp byte ptr[BX],' '
  179. jne INVSYMBBW ; если не пробел - то это неверный символ
  180. PROBBW: ; пропуск пробелов до начала следующего слова
  181. inc BX
  182. cmp BX,DX
  183. jl M1BW
  184. jmp ERRZICLBW ; в конце предложения нет '.' либо '?' либо '!'
  185. M1BW:
  186. cmp byte ptr[BX],' '
  187. je PROBBW
  188. jmp ENDPRBW
  189. ERRZICLBW:
  190. LEA DX,TEXT1BW
  191. CALL PRT
  192. mov BWC,1
  193. jmp ENDPRBW
  194. INVSYMBBW:
  195. lea DX,TEXT2BW
  196. mov AH,[BX]
  197. mov SYMBW,AH
  198. lea AX,STROKA
  199. SUB AX,BX
  200. neg AX
  201. inc AX
  202. lea BX,buffer2
  203. call CONVBA
  204. CALL PRT
  205. KONBW:
  206. mov BWC,1
  207. ENDPRBW:
  208. pop AX
  209. pop DX
  210. ret
  211. BEG_WORD endp
  212. ;*********************************************
  213. CODES ENDS
  214. END MAIN

Решение задачи: «Обработка строковых данных. Поменять местами два слова (tasm)»

textual
Листинг программы
  1. ; fasm code.....
  2. ; Меняет местави слова в строке с указанными индексами
  3. org 100h
  4. jmp start
  5.  
  6. mes0    db    13,10,' Длинна слов...: $'
  7. mes1    db    13,10,' Введите строку: $'
  8. mes2    db    13,10,' Номер слова A.: $'
  9. mes3    db    13,10,' Номер слова B.: $'
  10. mes4    db    13,10,' --------------------'
  11.         db    13,10,' Результат.....: $'
  12. mes5    db    07,' <--- Ошибка ввода! $'
  13.  
  14. buff    db    80 dup('$')        ; буфер для строки
  15. bWord   db    10 dup('$')        ;       ..и для слова
  16.  
  17. size    dw    0                  ; длина слова
  18. count   dw    0                  ; кол-во слов в строке
  19. possA   dw    0                  ; позиции слов
  20. possB   dw    0                  ; ^
  21. ;-----------------------------------------------------------------------
  22. start:  mov   ax,3               ; очистка экрана
  23.         int   10h                ;
  24.  
  25.         mov   dx,mes0            ; первая операция
  26.         call  message            ;
  27.         mov   ah,1               ;
  28.         int   21h                ;
  29.         cmp   al,'1'             ; фильтр чисел (нуль не нужен)
  30.         jb    start              ;
  31.         cmp   al,'9'             ;
  32.         ja    start              ;
  33.         and   ax,0fh             ;
  34.         mov   [size],ax          ; запоминаем длину слов
  35.         push  ax                 ;
  36.  
  37.         mov   dx,mes1            ;
  38.         call  message            ;
  39.         mov   di,buff            ;
  40.         xor   bx,bx              ;
  41.         pop   dx                 ;
  42. input:  mov   cx,dx              ; ставим её циклом
  43.         mov   ah,1               ;
  44. sWord:  int   21h                ; вводим строку..
  45.         cmp   al,13              ;   ..до Enter
  46.         je    begin              ;
  47.         stosb                    ;
  48.         loop  sWord              ;
  49.         mov   al,' '             ; авто/разделитель слов
  50.         int   29h                ;
  51.         stosb                    ;
  52.         inc   bx                 ; считаем кол-во слов
  53.         jmp   input              ;
  54.  
  55. begin:  mov   [count],bx         ; запомним..
  56.         mov   dx,mes2            ;
  57.         call  message            ;
  58.         call  inputA             ;
  59.         mov   [possA],ax         ; запоминаем А
  60.  
  61.         mov   dx,mes3            ;
  62.         call  message            ;
  63.         call  inputA             ;
  64.         mov   [possB],ax         ; запоминаем В
  65.  
  66.         mov   dx,mes4            ;
  67.         call  message            ;
  68. ;----------------------------------------------------------------
  69. ; Здесь нужно организовать обмен словами
  70. ;----------------------------------------------------------------
  71.         mov   ax,[possA]         ;
  72.         call  getPosition        ; SI - указатель на слово(А) в строке
  73.         push  si                 ; (запомним его для обмена)..
  74.         mov   di,bWord           ; адрес приёмника
  75.         mov   cx,[size]          ; кол-во байт для копирования
  76.         rep   movsb              ; слово(А) в промежуточном буфере(С)
  77.  
  78.         mov   ax,[possB]         ;
  79.         call  getPosition        ; SI - позиция слова(В) (источник)
  80.         pop   di                 ; DI - приёмник
  81.         push  si                 ;
  82.         mov   cx,[size]          ;
  83.         rep   movsb              ; замена слов: В --> A
  84.  
  85.         mov   si,bWord           ;
  86.         pop   di                 ;
  87.         mov   cx,[size]          ;
  88.         rep   movsb              ; замена слов: буфер(С) --> В
  89.  
  90.         mov   dx,buff            ; выводим изменённую строку на экран
  91.         call  message            ;
  92. ;----------------------------------------------------------------
  93.  
  94. exit:   xor   ax,ax
  95.         int   16h
  96.         int   20h                ; на выход!
  97.  
  98.  
  99. ;eeeeeeeeeeeeeeeee П Р О Ц Е Д У Р Ы eeeeeeeeeeeeeeeeeeeeeeeeeeee
  100. message:                         ;
  101.         mov   ah,9               ;
  102.         int   21h                ;
  103.         ret                      ;
  104. ;----------------------------------------------------------------
  105. inputA: mov   ah,1               ; ввод А/В
  106.         int   21h                ;
  107.         and   ax,0fh             ;
  108.         cmp   ax,[count]         ; ввод больше кол-ва слов?
  109.         jb    okey               ;
  110.         mov   dx,mes5            ; да - ошибка!
  111.         call  message            ;
  112.         pop   ax                 ; снимаем адрес возврата
  113.         jmp   exit               ; прощаемся..
  114. okey:   ret                      ; нет - выход из функции без ошибки!
  115.  
  116. getPosition:
  117.         mov   bx,[size]          ; длина слова
  118.         inc   bx                 ; добавим пробел
  119.         mul   bx                 ; АХ = позиция слова
  120.         sub   ax,bx              ; вычитаем разницу (т.к.отсчёт с нуля)
  121.         mov   si,buff            ;
  122.         add   si,ax              ; SI - указатель на начало слова
  123.         ret                      ;

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


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

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

6   голосов , оценка 4.167 из 5

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

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

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