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