Guest User

Untitled

a guest
Aug 18th, 2018
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. ;главный моудль, считвающий инф и передающий на обработку в доп
  3.  
  4. extrn _LONGESTWORD:far
  5. extrn _RETKOL:far
  6. .model small
  7.  
  8. .stack 100h
  9.  
  10. .data
  11. buf db 40,?,39 dup(?)
  12. str db 40 dup(?)
  13. text1 db 'Programma zapustilas. Vvedite stroku:',13,10,'$'
  14. text_noword db 'Slovo ne bylo naydeno.',13,10,'$'
  15. text_lw db 'Samoe dlinnoe slovo: ',13,10,'$'
  16. text_kol_a db 'Kol-vo vhozhdeniy A:',13,10,'$'
  17.  
  18. StrNum dw 4 dup(?),'$'
  19. Negate db ?
  20. nl db 13,10, '$'
  21.  
  22. .code
  23.  
  24. start proc far
  25. mov ax, @data
  26. mov ds, ax
  27. mov es,ax
  28.  
  29. m1: lea dx, text1
  30. call WrStr
  31.  
  32. ;Сама программа
  33. ;----------*************
  34. call ReadStr
  35. push ax
  36. call _LONGESTWORD
  37. lea dx,nl
  38. call WrStr
  39. call WriteRez
  40. ;----------*************
  41. m4: mov ah, 4Ch ;Функція завершення програми
  42. int 21h ;Переривання MS-DOS
  43. start endp ; Кінець процедури start
  44.  
  45. ReadStr proc
  46. ;mov ax, @data
  47. ;mov ds, ax
  48. lea dx,buf
  49. mov ah,0Ah
  50. int 21h
  51. sub cx,cx
  52. mov bx,1
  53. mov cl,buf[bx]
  54. add dx,2
  55. lea di,str
  56. mov [di],cl
  57. inc di
  58. mov bx,cx
  59. mov byte ptr [di][bx], '$'
  60. mov si, dx
  61. cld
  62. rep movsb
  63. lea ax,str
  64. ret
  65. ReadStr endp
  66.  
  67. ;****************************
  68. WriteRez proc
  69. lea dx, text_lw
  70. call WrStr
  71. mov dx, ax
  72. call WrStr
  73. lea dx,nl
  74. call WrStr
  75. lea dx,text_kol_a
  76. call WrStr
  77. call _RETKOL
  78. call StrCon
  79. lea dx,StrNum
  80. call WrStr
  81. call clear
  82. ret ;
  83. WriteRez endp
  84.  
  85. ;**********************
  86. StrCon proc
  87. push ax
  88. push cx
  89. push dx
  90. push bx
  91. push si
  92. mov cx, 10
  93. lea si, StrNum + 3
  94. mov Negate, 0
  95. cmp ax, 8000h
  96. jb m5
  97. neg ax
  98. mov Negate, 1
  99. m5:
  100. cmp ax, 10
  101. jb m6
  102. cwd
  103. div cx
  104. or dl, 30h
  105. mov [si], dl
  106. dec si
  107. jmp m5
  108. m6:
  109. or al, 30h
  110. mov [si], al
  111. cmp Negate, 0
  112. jz m7
  113. dec si
  114. mov byte ptr [si], '-'
  115. m7 : pop si
  116. pop bx
  117. pop dx
  118. pop cx
  119. pop ax
  120. ret
  121. StrCon endp
  122. ; *************************
  123. WrStr proc near
  124. public WrStr
  125. push ax
  126. mov ah,09h
  127. int 21h
  128. pop ax
  129. ret ; Повернення з процедури
  130. WrStr endp ; Кінець процедури (підпрограми) WrStr
  131. ;***********************
  132. clear proc
  133. push cx
  134. push dx
  135. push si
  136. lea si,StrNum
  137. mov cx,4
  138. re: mov dl,20h
  139. mov [si],dl
  140. inc si
  141. loop re
  142. pop si
  143. pop dx
  144. pop cx
  145. ret
  146. clear endp
  147.  
  148. ;*************************
  149. end start
  150. end
  151.  
  152.  
  153.  
  154. ;*/*/*/*/*/*/*/*/*/**/*/*/*/*/*/*/*/*/
  155. ;*/*/*/*/*/*/*/*/*/*/**/*/*/*/*/*/*/*/
  156. ;/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
  157.  
  158.  
  159. ;доп модуль
  160.  
  161. .model small
  162.  
  163. .data
  164.  
  165. str dw ?
  166.  
  167. a_amount dw ?
  168.  
  169. longword db 40 dup('$')
  170. lw_inf dw 2 dup (0); 1-е два байта - адрес начала слова, 2 - его длина
  171. nl db 13,10, '$'
  172.  
  173. .code
  174.  
  175. ;************Находим самое длинное слово
  176. _LONGESTWORD proc
  177. public _LONGESTWORD
  178. push bp
  179.  
  180. mov bp, sp
  181. mov ax, [bp+6]
  182. pop bp
  183. mov str, ax
  184. cld
  185. lea bx,lw_inf; массив с адресом начала и длины самого длинного в этот момент слова
  186. mov di,str
  187. sub cx,cx
  188. mov cl,[di]
  189. inc di
  190. mov al,' '
  191. c1: repe scasb;идем по строке, пока есть пробелы
  192. jne c2
  193. jmp c4
  194. c2:
  195. dec di
  196. mov si,di;сохраняем адрес начала слова
  197. inc di
  198. repne scasb;идем по слову до первого пробела
  199. mov dx,di
  200. ;dec dx;адрес после конца слова
  201. sub dx, si;находим длину слова
  202. cmp dx, [bx+1*2]
  203. jb c3
  204. mov [bx],si
  205. mov [bx+1*2],dx
  206. c3: jcxz c4
  207. jmp c1
  208. ;***************Копирование слова в строку
  209. c4:cld
  210. mov cx,[bx+1*2]
  211. lea di,longword
  212. mov si,[bx]
  213. push cx
  214. rep movsb
  215. pop cx
  216. call CountA
  217. lea ax,longword
  218.  
  219. pop bp
  220. ret 4
  221. _LONGESTWORD endp
  222.  
  223. ;******Находим вхождения A
  224. CountA proc
  225. mov bx,0
  226. mov di, 0
  227. c5: cmp long
  228.     13:48:51   
  229.        
  230. c5: cmp longword[di], 'A'
  231. je m14
  232. cmp longword[di], 'a'
  233. je m14
  234. jmp m15
  235. m14: inc bx
  236. m15: inc di
  237. loop c5
  238. mov a_amount,bx
  239. ret
  240. CountA endp
  241.  
  242. _RETKOL proc ;функция возвращает количество вхождений 'A/a' в слово
  243. public _RETKOL
  244. mov ax,a_amount
  245. _RETKOL endp
  246. End
  247.  
  248.  
  249. ;/*/*/*/*/*/*/*/*/*/*/*/*/*/*
  250. ;/*/*/*/*/*/*/*/*/*/*/*/*/*/*
  251. ;/*/*/*/*/*/*/*/*/*/*/*/*/*/*
  252. ;/*/*/*/*/*/*/*/*/*/*/*/*/*/*
  253. ;/*/*/*/*/*/*/*/*/*/*/*/*/*/*
  254.  
  255. ;Главный модуль на Си
  256.  
  257. #include <stdio.h>
  258. extern "C" char* LONGESTWORD(char*s);
  259. extern "C" int RETKOL();//возвращает количество букв А
  260.  
  261. char* READSTR()
  262. {
  263. static char s[20];
  264. char* p=s;
  265. p++;
  266. *s=scanf("%s",&p);
  267. p[*s]='$';
  268. return s;
  269. }
  270.  
  271. void WRITEREZ (char* lw,int kol)
  272. {
  273. printf("Samoe dlinnoe slovo:\n");
  274. for(int i=0;lw[i]!='$';i++)
  275. printf("%c",lw[i]);
  276. printf("\n");
  277. printf("Kol-vo vh A:\n");
  278. printf("%d",kol);
  279. }
  280.  
  281. void main()
  282. {char *lw=LONGESTWORD(READSTR());
  283. int kol=RETKOL();
  284. WRITEREZ(lw,kol);
  285. }
Add Comment
Please, Sign In to add comment