.model small .stack 1000 .data ;-----------------------( Visos Error zinutes )------------------ err1 db 'Vykdymo sintakse failas.exe ', 0Dh,0Ah, '$' err2 db 'Ivyko klaida atidarant faila',0Dh,0Ah,'$' err3 db 'Del neaiskiu priezasciu negalima nuskaityt input failo',0Dh,0Ah,'$' err4 db 'Input ir output failo vardai vienodi?!',0Dh,0Ah,'$' ;-----------------------( Failai, ju handle'ai.. ) -------------- f1name db 50 dup('!') ; input failo pavadinimas, paimsim is ES f1hand dw ? ; input failo handle'as f1buf db 81, 82 dup (?) ; input failo bufferis f1len dw 0 f2name db 50 dup('!') f2len dw 0 f2hand dw ? f2buf db 81, 82 dup (?) ; input failo bufferis IObuf db 4096 dup(0) ; ivedimo buferis IOsize dw 0 ; dydis kiek rasyt reikes CWordL dw 0 ; dabartinio zodzio eiluteje ilgis simb db 1 dup('0') mystr db 50 dup('0') mystrlen dw 0 parCnt dw 0 ;----------------------( procedura writeskaicius ) ------------- buf db 10 dup(0) bufe db '$' ten dw 10 .code main proc mov ax, ds mov es, ax mov ax,@data mov ds,ax ;------------------( Nusiskaitom parametrus i f1name ir f2name ) ------------- mov si, 80h xor cx, cx mov cl, es:[si] cmp cx, 0 jz printErr1 lea di,f1name xor cx,cx tarpas: inc si mov al,es:[si] cmp al,' ' je tarpas cmp bx,1 je parametras2 parametras1: mov [di],al inc di inc si inc f1len inc cx mov al,es:[si] cmp al,' ' je baigiasParam1 cmp al,0dh je baigiasParam1 jmp parametras1 baigiasParam1: mov [di],byte ptr '0' mov bx,1 cmp cl,0 je printErr1 cmp cl,12 jg printErr1 inc si lea di,f2name parametras2: mov al,es:[si] cmp al,' ' je tarpas cmp al,0dh je baigiasParam2 mov [di],al inc di inc f2len inc cx inc si jmp parametras2 printErr1: lea dx, err1 mov ah, 09h int 21h jmp TheEnd baigiasParam2: mov [di],byte ptr '0' mov ax,f1len cmp ax,f2len jne start lea si,f1name lea di,f2name check: mov ah,[si] mov bh,[di] inc si inc di cmp ah,bh jne start jmp printErr4 start: ;--------------------------( Atidarom 1 faila! ) ------------- mov ah, 3dh ; dos'o funkcija atidaranti faila mov al, 0 ; atidarymo mode'as r , skaitysim mov dx,offset f1name ; ka atidarysim skaitymui? int 21h jc printErr2 ; jei ivyko klaida atidarant mov f1hand, ax ; issisaugom handle 'kintamjam' ;--------------------------( Atidarom 2 faila! ) ------------- mov dx,offset f2name ; DX rodo i failo vardo pirma baita mov ah,3dh ; atidarymo funkcija mov al,1 int 21h jnc cool create: lea dx,f2name ; DX rodo i failo vardo pirma baita mov ah,3ch ; atidarymo funkcija mov cx,0 ; sukurimas su normaliu atributu int 21h cool: mov f2hand,ax xor ax,ax xor dx,dx mov ah,0aH mov dx,offset mystr int 21h call writeln mov si,offset mystr mov al,[si+1] mov ah,0 mov mystrlen,ax call writeskaicius mov ah,42h ; pradesim visad rasyt nuo failo pradzios mov bx,f2hand mov cx,0 mov dx,0 mov al,0 int 21h mov ah,40h mov bx,f2hand mov cx,0000h xor dx,dx int 21h jmp do printErr4: lea dx, err4 mov ah, 09h int 21h jmp TheEnd printErr2: lea dx, err2 mov ah, 09h int 21h jmp TheEnd do: call getl cmp bx,1 jne continue ; primesim gale #13 ir #10 ir rasysim i f2hand mov [si],byte ptr 13 inc si mov [si],byte ptr 10 mov ah,40h mov bx,f2hand mov dx,offset IObuf add IOsize,2 mov cx,IOsize int 21h continue: cmp bp,1 je TheEnd mov IOsize,0 jmp do TheEnd: mov ah,3eh mov bx,f1hand int 21h mov ah,3eh mov bx,f2hand int 21h mov ax, 4c00h ; gritam i OS int 21h endp ;------------( funkcija 1 baito isvedimui i stdout )----------- ; ; Jei getc grazina bp=1 pasiekem failo gala ; Jei getc grazina di=1 pasiekem eilutes gala (#13) ; abiem atvejais belieka patikrinti ar dabar suformuotas zodis ; yra trumpesnis/lygus ivestam ir nustatyti bx=1 jei taip, kad ; sia eilute isvestume ; getc proc mov bp,0 ignore: mov di,0 mov ah,3fh mov bx,f1hand mov dx,offset simb mov cx,1 int 21h mov dh,simb cmp dh,byte ptr 13 je ignore ; 13ta simboli praleisim tiesiog kad neisirasytu kur nereik cmp dh,byte ptr 10 jne CheckEOF mov di,1 CheckEOF: cmp ax,cx je NotEOF mov bp,1 NotEOF: ret endp ; Jei getl grazina bx=1 tai sita eilute perrasysim i kita faila nes tenkina salyga ; jei =0, nerasom getl proc mov bx,0 ; tarkim kad sios eilutes nerasysim lea si,IObuf begin: mov CWordL,0 call getc cmp di,1 je compareandexit cmp bp,1 je compareandexit mov ah,simb cmp ah,' ' jne writeIO space: mov ah,simb mov [si],ah inc si inc IOsize mov dx,mystrlen cmp CWordL,dx jg wontWriteThisWord mov bx,1 wontWriteThisWord: mov bx,0 mov CWordL,0 call getc cmp di,1 je compareandexit cmp bp,1 je compareandexit mov ah,simb cmp ah, ' ' je space writeIO: inc CWordL mov ah,simb mov [si],ah inc si inc IOsize call getc mov ah,simb cmp ah,' ' je space cmp di,1 je compareandexit cmp bp,1 je compareandexit jmp writeIO compareandexit: mov dx,mystrlen cmp CWordL,dx jg wontWriteThisLine mov bx,1 jmp exit wontWriteThisLine: mov bx,0 exit: ret endp writeln proc mov dl, 0dh ; mov ah, 06h ; uzrasome ant ekrano #13 #10 int 21h ; mov dl, 0ah ; int 21h ; ret endp writeskaicius proc ; isveda ax i ekrana lea si, buf ; is pradziu isvalom buferi mov bl, ' ' mov bh, 0 val: mov [si], bl inc si inc bh cmp bh, 10 jl val lea si, bufe ; ds:si rodys i bufe dar: ; repeat ... (ax > 0) xor dx, dx ; nuvalomas dx (dx=0) div ten ; ax := ax div 10 add dl, 30h ; dl := dl + 30h dec si ; si := si - 1 (si--) mov [si], dl ; ds:si := dl cmp ax, 0 ; if ax > 0 jg dar ; then goto dar lea dx, buf ; ds:dx rodys i buf mov ah, 9h ; spec. funkcija isvedimui int 21h ; i ekrana ret endp end