All pastes #259776 Raw Edit

Miscellany

public text v1 · immutable
#259776 ·published 2006-11-27 19:18 UTC
rendered paste body
.model small
.stack 1000	
.data
    ;-----------------------( Visos Error zinutes )------------------
    err1 db 'Vykdymo sintakse failas.exe <inputfailas> <outputfailas>', 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