Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;главный моудль, считвающий инф и передающий на обработку в доп
- extrn _LONGESTWORD:far
- extrn _RETKOL:far
- .model small
- .stack 100h
- .data
- buf db 40,?,39 dup(?)
- str db 40 dup(?)
- text1 db 'Programma zapustilas. Vvedite stroku:',13,10,'$'
- text_noword db 'Slovo ne bylo naydeno.',13,10,'$'
- text_lw db 'Samoe dlinnoe slovo: ',13,10,'$'
- text_kol_a db 'Kol-vo vhozhdeniy A:',13,10,'$'
- StrNum dw 4 dup(?),'$'
- Negate db ?
- nl db 13,10, '$'
- .code
- start proc far
- mov ax, @data
- mov ds, ax
- mov es,ax
- m1: lea dx, text1
- call WrStr
- ;Сама программа
- ;----------*************
- call ReadStr
- push ax
- call _LONGESTWORD
- lea dx,nl
- call WrStr
- call WriteRez
- ;----------*************
- m4: mov ah, 4Ch ;Функція завершення програми
- int 21h ;Переривання MS-DOS
- start endp ; Кінець процедури start
- ReadStr proc
- ;mov ax, @data
- ;mov ds, ax
- lea dx,buf
- mov ah,0Ah
- int 21h
- sub cx,cx
- mov bx,1
- mov cl,buf[bx]
- add dx,2
- lea di,str
- mov [di],cl
- inc di
- mov bx,cx
- mov byte ptr [di][bx], '$'
- mov si, dx
- cld
- rep movsb
- lea ax,str
- ret
- ReadStr endp
- ;****************************
- WriteRez proc
- lea dx, text_lw
- call WrStr
- mov dx, ax
- call WrStr
- lea dx,nl
- call WrStr
- lea dx,text_kol_a
- call WrStr
- call _RETKOL
- call StrCon
- lea dx,StrNum
- call WrStr
- call clear
- ret ;
- WriteRez endp
- ;**********************
- StrCon proc
- push ax
- push cx
- push dx
- push bx
- push si
- mov cx, 10
- lea si, StrNum + 3
- mov Negate, 0
- cmp ax, 8000h
- jb m5
- neg ax
- mov Negate, 1
- m5:
- cmp ax, 10
- jb m6
- cwd
- div cx
- or dl, 30h
- mov [si], dl
- dec si
- jmp m5
- m6:
- or al, 30h
- mov [si], al
- cmp Negate, 0
- jz m7
- dec si
- mov byte ptr [si], '-'
- m7 : pop si
- pop bx
- pop dx
- pop cx
- pop ax
- ret
- StrCon endp
- ; *************************
- WrStr proc near
- public WrStr
- push ax
- mov ah,09h
- int 21h
- pop ax
- ret ; Повернення з процедури
- WrStr endp ; Кінець процедури (підпрограми) WrStr
- ;***********************
- clear proc
- push cx
- push dx
- push si
- lea si,StrNum
- mov cx,4
- re: mov dl,20h
- mov [si],dl
- inc si
- loop re
- pop si
- pop dx
- pop cx
- ret
- clear endp
- ;*************************
- end start
- end
- ;*/*/*/*/*/*/*/*/*/**/*/*/*/*/*/*/*/*/
- ;*/*/*/*/*/*/*/*/*/*/**/*/*/*/*/*/*/*/
- ;/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*
- ;доп модуль
- .model small
- .data
- str dw ?
- a_amount dw ?
- longword db 40 dup('$')
- lw_inf dw 2 dup (0); 1-е два байта - адрес начала слова, 2 - его длина
- nl db 13,10, '$'
- .code
- ;************Находим самое длинное слово
- _LONGESTWORD proc
- public _LONGESTWORD
- push bp
- mov bp, sp
- mov ax, [bp+6]
- pop bp
- mov str, ax
- cld
- lea bx,lw_inf; массив с адресом начала и длины самого длинного в этот момент слова
- mov di,str
- sub cx,cx
- mov cl,[di]
- inc di
- mov al,' '
- c1: repe scasb;идем по строке, пока есть пробелы
- jne c2
- jmp c4
- c2:
- dec di
- mov si,di;сохраняем адрес начала слова
- inc di
- repne scasb;идем по слову до первого пробела
- mov dx,di
- ;dec dx;адрес после конца слова
- sub dx, si;находим длину слова
- cmp dx, [bx+1*2]
- jb c3
- mov [bx],si
- mov [bx+1*2],dx
- c3: jcxz c4
- jmp c1
- ;***************Копирование слова в строку
- c4:cld
- mov cx,[bx+1*2]
- lea di,longword
- mov si,[bx]
- push cx
- rep movsb
- pop cx
- call CountA
- lea ax,longword
- pop bp
- ret 4
- _LONGESTWORD endp
- ;******Находим вхождения A
- CountA proc
- mov bx,0
- mov di, 0
- c5: cmp long
- 13:48:51
- c5: cmp longword[di], 'A'
- je m14
- cmp longword[di], 'a'
- je m14
- jmp m15
- m14: inc bx
- m15: inc di
- loop c5
- mov a_amount,bx
- ret
- CountA endp
- _RETKOL proc ;функция возвращает количество вхождений 'A/a' в слово
- public _RETKOL
- mov ax,a_amount
- _RETKOL endp
- End
- ;/*/*/*/*/*/*/*/*/*/*/*/*/*/*
- ;/*/*/*/*/*/*/*/*/*/*/*/*/*/*
- ;/*/*/*/*/*/*/*/*/*/*/*/*/*/*
- ;/*/*/*/*/*/*/*/*/*/*/*/*/*/*
- ;/*/*/*/*/*/*/*/*/*/*/*/*/*/*
- ;Главный модуль на Си
- #include <stdio.h>
- extern "C" char* LONGESTWORD(char*s);
- extern "C" int RETKOL();//возвращает количество букв А
- char* READSTR()
- {
- static char s[20];
- char* p=s;
- p++;
- *s=scanf("%s",&p);
- p[*s]='$';
- return s;
- }
- void WRITEREZ (char* lw,int kol)
- {
- printf("Samoe dlinnoe slovo:\n");
- for(int i=0;lw[i]!='$';i++)
- printf("%c",lw[i]);
- printf("\n");
- printf("Kol-vo vh A:\n");
- printf("%d",kol);
- }
- void main()
- {char *lw=LONGESTWORD(READSTR());
- int kol=RETKOL();
- WRITEREZ(lw,kol);
- }
Add Comment
Please, Sign In to add comment