Asembler - otwieranie plików

0

Witam, mam problem z wczytywaniem z wiersza poleceń i z otwieraniem plików. Jestem początkujący dopiero. A mianowicie, gdy wywołuję program w wierszu poleceń "zad.exe plik_wej.txt plik_wyj.txt", to wczytuje argumenty, ale zwraca błąd przy otwieraniu pliku wyjściowego. Natomiast, gdy uruchomię go w taki sposób "zad.exe plik_wej.txt plik_wyj.txt dowolny_ciąg_znaków", to działa poprawnie. Właśnie chcę się pozbyć tego, że trzeba wpisywać jakieś znaki po pliku wyjściowym. Nie wiem gdzie ten błąd się czai, czy we wczytywaniu argumentów, czy przy otwieraniu plików. Gdyby ktoś mógł to zweryfikować, byłbym wdzięczny.

dane1 segment

brak_argumentow		db	"Nie podales argumentow",13,10,'$'
za_malo_arg			db  "Za malo argumentow",13,10,'$'
odczytano_arg		        db 	"Odczytano argumenty z wiersza polecen",13,10,'$'
blad_otwierania 	                db 	"Nie udalo sie otworzyc pliku $"
blad_otwierania1	        db 	"wejsciowego$"
blad_otwierania2 	        db 	"wyjsciowego$"
otw_zakonczone                db  "Otwarto plik wejsciowy i wyjsciowy",13,10,'$'

plik_wejsciowy		dw	?
nazwa_pl_wej		db	50 dup(0)
plik_wyjsciowy		dw	?
nazwa_pl_wyj		db  50 dup(0)

dane1 ends

code1 segment

start1:
		;inicjalizacja stosu
		mov ax,seg w_stosu
		mov ss,ax
		mov sp,offset w_stosu

		call wczytaj_z_wiersza_polecen		;wczytaj argumenty

		call otworz_pliki					;otwiera pliki do zapisu i odczytu

		mov al,0 ;zwrocimy 0 do systemu
		mov ah,4ch
		int 21h


;------------------------------------------------------------------------------

otworz_pliki:
		mov ax,seg dane1
		mov ds,ax

		;plik do odczytu
		mov ax,seg nazwa_pl_wej
		mov ds,ax
		mov dx,offset nazwa_pl_wej
		mov cx,0
		mov ax,0							;tylko do odczytu
		mov ah,3dh							;otwieranie pliku o nazwie w ds:dx
		int 21h
		jc blad_otwarcia1					;informacja o bledzie we fladze carry
		mov ds:[plik_wejsciowy],ax 			;zapisujemy uchwyt

		;plik do zapisu
		mov ax,seg nazwa_pl_wyj
		mov ds,ax
		mov dx,offset nazwa_pl_wyj
		mov al,1 							;tylko do zapisu
		mov ah,3dh							;otwieranie pliku
		int 21h
		jc blad_otwarcia2
		mov ds:[plik_wyjsciowy],ax 			;zapisujemy uchwyt

	koniec_otwierania:
		mov dx,offset otw_zakonczone
		call wypisz_string
		ret

	blad_otwarcia1:
		mov dx,offset blad_otwierania
		call wypisz_string
		mov dx,offset blad_otwierania1
		call wypisz_string
		jmp koniec_programu

	blad_otwarcia2:
		mov dx,offset blad_otwierania
		call wypisz_string
		mov dx,offset blad_otwierania2
		call wypisz_string
		jmp koniec_programu

;------------------------------------------------------------------------

wczytaj_z_wiersza_polecen:
		mov cx,0	
		mov	cl,byte ptr ds:[080h]			;ilosc znakow w linii komend
		cmp cl,0							;czy sa argumenty?
		jne wczytaj_argumenty				;są znaki, skocz -> wczytaj	
		mov dx,offset brak_argumentow		;komunikat o bledzie
		call wypisz_string					;wypisz komunikat
		jmp koniec_programu					;wyjscie z programu

	wczytaj_argumenty:
		mov si,082h							;poczatek parametrow
		mov ax,seg nazwa_pl_wej
		mov es,ax
		mov di,offset nazwa_pl_wej			;di - poczatek bufora
		mov bl,' '							;parametr oddzielony spacja
	petla_wczytaj_nazwa_pl_wej:
		call wczytaj_do_bufora_i_rozdziel	;wczytuje z ds:[si] do es:[di]
	wczytaj_nazwa_pl_wyj:
		call idz_za_spacje 					;przesuwa si
		mov ax,seg nazwa_pl_wyj
		mov es,ax
		mov di,offset nazwa_pl_wyj 			;di->poczatek bufora
		mov bl,' '
		call wczytaj_do_bufora_i_rozdziel

		mov dx,offset odczytano_arg
		call wypisz_string

		;Koniec procedury
		ret

;---------------------------------------------------------------------------------

wczytaj_do_bufora_i_rozdziel:
;wczytanie kolejnych znakow z ds:[si] do es:[di], cl - ilosc znakow pozostalych w linii komend

	petla_wczytaj_nazwa_pliku:
		cmp cl,0							;czy sa znaki do wczytania
		je koniec_wczytaj_z_linii_komend				;cl <= 0
		mov al,byte ptr ds:[si]				;wczytujemy znak z linii komend do al

		cmp al,bl 							;spacja rozdziela argumenty
		je koniec_wczytaj_z_linii_komend    ;jeśli al = spacja

		wczytaj_z_linii_komend:
			mov byte ptr es:[di],al			;al do bufora
			inc si
			inc di
			dec cl 							;jeden znak mniej do wczytania
			jmp petla_wczytaj_nazwa_pliku

	koniec_wczytaj_z_linii_komend:
		ret

	niepelny_argument:
		mov dx,offset za_malo_arg
		call wypisz_string				    ;wyswietl komunikat bledu
		jmp koniec_programu	

;---------------------------------------------------------------------------------


idz_za_spacje:
	petla_przesun_si_dalej:
		cmp cl,0
		jne wczytuj_dalej					;jeśli cl rozne od 0 
		mov dx,offset za_malo_arg
		call wypisz_string
		jmp koniec_programu

	wczytuj_dalej:
		cmp byte ptr ds:[si],' '
		jne koniec_idz_za_spacje
		inc si
		dec cl
		jmp petla_przesun_si_dalej

	koniec_idz_za_spacje:
		ret


koniec_programu:
	mov	ax,04c00h  							;koniec programu i powrot do DOS
	int	21h


wypisz_string:
		push ax
		push ds
		mov ax,seg dane1
		mov ds,ax
		mov ah,9h							;wypisz na ekranie string DS:DX
		int 21h
		pop ds
		pop ax
		ret

code1 ends

stos1 segment stack
		dw	250 dup(?)
w_stosu dw	?
stos1 ends

end start1
1
        mov bl,' '                            ;parametr oddzielony spacja

Ostatni parametr na końcu nie jest oddzielony spacją.

0

emu8086 twoim przyjacielem ;]

1 użytkowników online, w tym zalogowanych: 0, gości: 1