All pastes #1675639 Raw Edit

Stuff

public text v1 · immutable
#1675639 ·published 2009-11-18 00:00 UTC
rendered paste body
;***************************************************************
; Programa atidaranti fail? duom.txt, pakei?ianti ma??sias raides did?iosiomis ir rezultat? ?ra?anti ? fail? rez.txt
;***************************************************************

.model small

skBufDydis	EQU 180			;konstanta skBufDydis (lygi 20) - skaitymo buferio dydis
raBufDydis	EQU 180			;konstanta raBufDydis (lygi 20) - ra?ymo buferio dydis

.stack 500h

.data

	enteris  DB  13, 10, '$'
	klaidaSk	db "klaida skaitant$"
	klaidaRs	db "klaida rasant$"
	klaidaDalIr	db "klaida daliniam irasyme$"
	klaidaAtSk	db "klaida atidarant skaitymui faila$"
	klaidaAtRs	db "klaida atidarant rasymui faila$"
	klaidaUzSk	db "klaida uzdarant skaitymui faila$"
	klaidaUzRs	db "klaida uzdarant rasymui faila$"
	ivesk	db "iveskite failo pavadinima: $"
	duom	db 80			;duomen failo pavadinimas, pasibaigiantis nuliniu simboliu (C sintakse - '\0')
	rez	db "rez.txt",0		;rezultat failo pavadinimas, pasibaigiantis nuliniu simboliu
	skBuf	db skBufDydis dup (?)	;skaitymo buferis
	raBuf	db raBufDydis dup (?)	;ra?ymo buferis
	dFail	dw ?			;vieta, skirta saugoti duomen failo deskriptoriaus numer? ("handle")
	rFail	dw ?			;vieta, skirta saugoti rezultato failo deskriptoriaus numer?


.code
  pradzia:
	MOV	ax, @data		;reikalinga kiekvienos programos pradzioj
	MOV	ds, ax			;reikalinga kiekvienos programos pradzioj

	MOV	ah, 9
	MOV	dx, offset enteris
	INT	21h

	MOV ah, 9
	MOV dx, offset ivesk
	int 21h



;*****************************************************
;Duomen failo atidarymas skaitymui
;*****************************************************
	MOV	dx, offset duom

        mov 	ah,0ah 				;read file name from kb
	int 	21h 				;after read,dx remains start addr.of file name buf
	mov 	si,dx 				;use si for indexing first 3 byte locations in buf
	mov 	bl,[si+1] 			;get no.of char.read count(2nd byte)
	add 	si,02 				;point to 3rd byte,where actual name string starts
	sub 	bh,bh 				;clear bh, as used further
	mov 	BYTE PTR[si+bx],0 		;replace cr(0dh) at end of string with 0

	MOV	ah, 3Dh				;21h pertraukimo failo atidarymo funkcijos numeris
	MOV	dx, offset duom+2			;vieta, kur nurodomas failo pavadinimas, pasibaigiantis nuliniu simboliu
	MOV	al, 00				;00 - failas atidaromas skaitymui
	INT	21h				;failas atidaromas skaitymui
	JC	klaidaAtidarantSkaitymui	;jei atidarant fail? skaitymui ?vyksta klaida, nustatomas carry flag
	MOV	dFail, ax			;atmintyje i?sisaugom duomen failo deskriptoriaus numer?

;*****************************************************
;Rezultato failo suk?rimas ir atidarymas ra?ymui
;*****************************************************

	MOV	ah, 3Ch				;21h pertraukimo failo suk?rimo funkcijos numeris
	MOV	dx, offset rez+2		;vieta, kur nurodomas failo pavadinimas, pasibaigiantis nuliniu simboliu
	MOV	cx, 0				;kuriamo failo atributai
	INT	21h				;sukuriamas failas; jei failas jau egzistuoja, visa jo informacija i?trinama
	JC	klaidaAtidarantRasymui		;jei kuriant fail? skaitymui ?vyksta klaida, nustatomas carry flag
	MOV	rFail, ax			;atmintyje i?sisaugom rezultato failo deskriptoriaus numer?

;*****************************************************
;Duomen nuskaitymas i? failo
;*****************************************************
  skaityk:
	MOV	bx, dFail			;? bx ?ra?om duomen failo deskriptoriaus numer?
	CALL	SkaitykBuf			;i?kvie?iame skaitymo i? failo proced?r?
	CMP	ax, 0				;ax ?ra?oma, kiek bait buvo nuskaityta, jeigu 0 - pasiekta failo pabaiga
	JE	uzdarytiRasymui

;*****************************************************
;Darbas su nuskaityta informacija
;*****************************************************
	MOV	cx, ax
	MOV	si, offset skBuf
	MOV	di, offset raBuf
  dirbk:
	MOV	dl, [si]
	CMP dl, 'a'
	JB	tesk
	CMP dl, 'z'
	JA	tesk
	SUB dl, 20h
  tesk:
	MOV	[di], dl
	INC	si
	INC	di
	LOOP	dirbk
	
;*****************************************************
;Rezultato ?ra?ymas ? fail?
;*****************************************************
	MOV	cx, ax				;cx - kiek bait reikia ?ra?yti
	MOV	bx, rFail			;? bx ?ra?om rezultato failo deskriptoriaus numer?
	CALL	RasykBuf			;i?kvie?iame ra?ymo ? fail? proced?r?
	CMP	ax, raBufDydis			;jeigu vyko darbas su pilnu buferiu -> i? duomen failo buvo nuskaitytas pilnas buferis ->
	JE	skaityk				;-> reikia skaityti toliau
  
;*****************************************************
;Rezultato failo u?darymas
;*****************************************************
  uzdarytiRasymui:
	MOV	ah, 3Eh				;21h pertraukimo failo u?darymo funkcijos numeris
	MOV	bx, rFail			;? bx ?ra?om rezultato failo deskriptoriaus numer?
	INT	21h				;failo u?darymas
	JC	klaidaUzdarantRasymui		;jei u?darant fail? ?vyksta klaida, nustatomas carry flag
	
;*****************************************************
;Duomen failo u?darymas
;*****************************************************
  uzdarytiSkaitymui:
	MOV	ah, 3Eh				;21h pertraukimo failo u?darymo funkcijos numeris
	MOV	bx, dFail			;? bx ?ra?om duomen failo deskriptoriaus numer?
	INT	21h				;failo u?darymas
	JC	klaidaUzdarantSkaitymui		;jei u?darant fail? ?vyksta klaida, nustatomas carry flag

  pabaiga:
	MOV	ah, 4Ch				;reikalinga kiekvienos programos pabaigoj
	MOV	al, 0				;reikalinga kiekvienos programos pabaigoj
	INT	21h				;reikalinga kiekvienos programos pabaigoj

;*****************************************************
;Klaid apdorojimas
;*****************************************************
  klaidaAtidarantSkaitymui:
	MOV	ah, 9
	MOV	dx, offset enteris
	INT	21h	

	MOV ah, 9
	MOV dx, offset klaidaAtSk
	int 21h
	JMP	pabaiga

  klaidaAtidarantRasymui:
	MOV	ah, 9
	MOV	dx, offset enteris
	INT	21h	

	MOV ah, 9
	MOV dx, offset klaidaAtRs
	int 21h
	JMP	uzdarytiSkaitymui

  klaidaUzdarantRasymui:
	
	MOV	ah, 9
	MOV	dx, offset enteris
	INT	21h	

	MOV ah, 9
	MOV dx, offset klaidaUzRs
	int 21h
	JMP	uzdarytiSkaitymui

  klaidaUzdarantSkaitymui:
	
	MOV	ah, 9
	MOV	dx, offset enteris
	INT	21h	

	MOV ah, 9
	MOV dx, offset klaidaUzSk
	int 21h
	JMP	pabaiga

;*****************************************************
;Proced?ra nuskaitanti informacij? i? failo
;*****************************************************
PROC SkaitykBuf
;? BX paduodamas failo deskriptoriaus numeris
;? AX bus gr??inta, kiek simboli nuskaityta
	PUSH	cx
	PUSH	dx
	
	MOV	ah, 3Fh			;21h pertraukimo duomen nuskaitymo funkcijos numeris
	MOV	cl, skBufDydis		;cx - kiek bait reikia nuskaityti i? failo
	MOV	ch, 0			;i?valom vyresn?j? cx bait?
	MOV	dx, offset skBuf	;vieta, ? kuri? ?ra?oma nuskaityta informacija
	INT	21h			;skaitymas i? failo
	JC	klaidaSkaitant		;jei skaitant i? failo ?vyksta klaida, nustatomas carry flag

  SkaitykBufPabaiga:
	POP	dx
	POP	cx
	RET

  klaidaSkaitant:
	MOV	ah, 9
	MOV	dx, offset enteris
	INT	21h	

	MOV ah, 9
	MOV dx, offset klaidaSk
	int 21h
	MOV ax, 0			;Pa?ymime registre ax, kad nebuvo nuskaityta n? vieno simbolio
	JMP	SkaitykBufPabaiga

SkaitykBuf ENDP

;*****************************************************
;Proced?ra, ?ra?anti bufer? ? fail?
;*****************************************************
PROC RasykBuf
;? BX paduodamas failo deskriptoriaus numeris
;? CX - kiek bait ?ra?yti
;? AX bus gr??inta, kiek bait buvo ?ra?yta
	PUSH	dx
	
	MOV	ah, 40h			;21h pertraukimo duomen ?ra?ymo funkcijos numeris
	MOV	dx, offset raBuf	;vieta, i? kurios ra?om ? fail?
	INT	21h			;ra?ymas ? fail?
	JC	klaidaRasant		;jei ra?ant ? fail? ?vyksta klaida, nustatomas carry flag
	CMP	cx, ax			;jei cx nelygus ax, vadinasi buvo ?ra?yta tik dalis informacijos
	JNE	dalinisIrasymas

  RasykBufPabaiga:
	POP	dx
	RET

  dalinisIrasymas:
	MOV	ah, 9
	MOV	dx, offset enteris
	INT	21h	

	MOV ah, 9
	MOV dx, offset klaidaDalIr
	int 21h
	JMP	RasykBufPabaiga

  klaidaRasant:
	MOV	ah, 9
	MOV	dx, offset enteris
	INT	21h	

	MOV ah, 9
	MOV dx, offset klaidaRs
	int 21h
	MOV	ax, 0			;Pa?ymime registre ax, kad nebuvo ?ra?ytas n? vienas simbolis
	JMP	RasykBufPabaiga

RasykBuf ENDP	

END pradzia