; Program usuwa zawartosc podanego pliku i, pozniej, podany plik. ; ; Skladnia: ; "usun" i program poprosi o nazwe pliku do usuniecia ; "usun nazwa_pliku" ; ; Autor: Bogdan D. ; kontakt: bogdandr (at) op (dot) pl ; ; nasm -O999 -o usun.com -f bin usun.asm ; ; Copyright (C) 2005-2007 Bogdan 'bogdro' Drozdowski, bogdandr @ op . pl ; ; Ten program jest wolnym oprogramowaniem; mozesz go rozpowszechniac ; i/lub modyfikowac zgodnie z licencja GNU Lesser General Public License ; (GNU LGPL) w wersji wydanej przez Fundacje Wolnego Oprogramowania; ; wedlug wersji 3 Licencji lub (jesli wolisz) jednej z pozniejszych wersji. ; ; Ten program jest udostepniany z nadzieja, ze bedzie uzyteczny, lecz ; BEZ JAKIEJKOLWIEK GWARANCJI; nawet domyslnej gwarancji PRZYDATNOSCI ; HANDLOWEJ albo PRZYDATNOSCI DO OKRESLONYCH ZASTOSOWAN. W celu uzyskania ; blizszych informacji - Licencja GNU Lesser General Public License. ; ; Z pewnoscia wraz z niniejszym programem otrzymales tez egzemplarz ; Licencji GNU Lesser General Public License; jesli nie - napisz do ; Fundacji Wolnego Oprogramowania: ; Free Software Foundation ; 51 Franklin Street, Fifth Floor ; Boston, MA 02110-1301 ; USA org 100h start: mov ax, cs mov ds, ax mov es, ax ; ES = DS = CS mov si, 80h ; SI -> liczba znakow linii polecen mov bl, [si] ; BL = liczba znakow w linii polecen xor di, di inc si ; Si -> pierwszy znak linii ; polecen (spacja) mov dx, info mov ah, 9 int 21h ; wypisz info cmp bl, 2 ; sprawdzamy, czy podano nam jakies ; argumenty jb bez_arg inc si ; SI-> pierwszy znak nazwy pliku ; do usuniecia jmp z_arg ; ==================================== bez_arg: mov dx, input1 mov ah, 9 int 21h ; prosba o wpisanie nazwy pliku petla: xor ah, ah int 16h ; pobieramy znak mov ah, 0eh cmp al, 1bh ; jesli Esc, to wychodzimy z programu jnz znak_dalej jmp zamk_ok znak_dalej: cmp al, 0dh ; Enter oznacza koniec wpisywania jz input_juz cmp al, 8 ; sprawdzamy, czy BackSpace jz bksp int 10h ; wyswietlamy wprowadzony znak mov [plik+di], al ; i zapisujemy go cmp di, 7fh ; sprawzdamy, czy jeszcze mamy miejsce jz input_juz inc di jmp short petla ; pobierzemy kolejny znak bksp: ; nacisnieto BkSp or di, di jz petla ; czy mamy co usuwac? dec di ; zmniejszamy ilosc ; wprowadzonych znakow int 10h ; kasujemy znak z ekranu: mov al, ' ' int 10h mov al, 8 int 10h jmp short petla ; i idziemy wczytywac nowe znaki ; ==================================== input_juz: ;;; mov ax, 3d02h ; w DOSie: otworz R/W, deny All ;;; mov dx, plik mov ax, 716ch ; otworz plik z dluga nazwa mov dx, 1 ; otwarcie pliku xor cx, cx ; atrybuty mov si, plik ; nazwa pliku mov di, 1 ;;; mov bx, 0110010000010010b ; r/w, deny all, 6412h mov bx, 6412h ; r/w, deny all, 6412h int 21h ; otwieramy jnc otw_ok ; sprawdzamy, czy wystapil jakis blad call plik_blad ; wsywietlamy informacje o bledzie jmp short usuw_ok ; wychodzimy, gdy blad otw_ok: mov bx, ax ; BX = uchwyt do pliku (file handle) xor esi, esi ; licznik sluzacy do okreslenia ; rozmiaru pliku ; ==================================== ; petla obliczajaca rozmiar pliku ; ESI = rozmiar w kB mov cx, 400h ; 1 kB mov dx, bufor ; dokad czytac policz: mov ah, 3fh ; czytaj z pliku int 21h jnc czyt_ok ; sprawdz, czy nie ma bledu call plik_blad jmp short zamk czyt_ok: cmp ax, cx ; AX < CX, czyli przeczytalismy ; mniej niz chcielismy ; a to oznacza koniec pliku jb policz_juz inc esi ; ESI = ilosc kilobajtow pliku jmp short policz ; ==================================== policz_juz: ; rozmiar pliku = ESI * 1024 + AX mov di, ax ; resztka mov ax, 4200h ; funkcja przejscia w inne ; miejsce pliku xor cx, cx xor dx, dx ; odleglosc = 0 int 21h ; przechodzimy na poczatek pliku mov dx, bufor+400h ; dx pokazuje na 1 kB zapisany zerami or esi, esi jz reszta ; jesli rozmiar pliku < 1kB , to ; zapiszemy tylko resztke mov cx, 400h ; ilosc znakow do zapisania zapisz: mov ah, 40h ; zapisz zera int 21h jc zapis_blad dec esi jnz zapisz ; tyle razy, ile trzeba ; ==================================== ; zapisanie resztki reszta: mov cx, di ; CX = DI = dlugosc resztki mov ah, 40h ; funkcja zapisu int 21h ; zapisujemy resztke mov ax, 4200h xor cx, cx xor dx, dx int 21h ; przechodzimy na poczatek pliku xor cx, cx ; zapis zera bajtow oznacza ; obciecie pliku do biezacej ; pozycji (ktora jest poczatek pliku) mov ah, 40h int 21h ; skracamy plik jmp short zamk zapis_blad: call plik_blad jmp short zamk ; ********************************** zamk: mov ah, 3eh int 21h ; zamykamy plik jnc zamk_ok call plik_blad zamk_ok: mov ax, 7141h ; funkcja usuniecia pliku o ; dlugiej nazwie mov dx, plik ; DX -> nazwa pliku xor si, si xor cx, cx int 21h ; usuwamy plik jnc usuw_ok call plik_blad usuw_ok: mov ax, 4c00h ; wyjscie int 21h ; ==================================== ; podano nam cos na linii polecen ; wczytujemy nazwe pliku z ; linii polecen: z_arg: xor di, di bez_spc: mov al, [si] ; pobierz kolejny znak cmp si, 100h ;sprawdz, czy nie koniec linii polecen je wej_juz inc si ; kolejny znak ; wyrzucamy znaki biale przed ; nazwa pliku cmp al, ' ' je bez_spc cmp al, 09 ; TAB je bez_spc wej: cmp al, 0dh ; Enter oznacza koniec je wej_juz ; pomijamy apostrofy itp. ; cmp al, '"' ; czy " cmp al, 34 je omin ; cmp al, "'" ; czy ' cmp al, 39 je omin cmp al, 96 ; czy ` je omin mov [plik+di], al ; zapisujemy znak inc di omin: mov al, [si] ; pobieramy kolejny znak inc si cmp si, 100h ;sprawdz, czy nie koniec linii polecen je wej_juz jmp short wej ; skaczemy do "wej", bo nie chcemy ; wyrzucac spacji z nazwy pliku wej_juz: jmp input_juz ; ======================================================= plik_blad: push ax push bx mov bx, ax mov dx, blad_plik mov ah, 9 int 21h ; info o tym, ze wystapil blad mov ax, bx call pl ; wyswietlamy numer bledu pop bx pop ax ret ; ======================================================= pl: ; wyswietla liczbe z AX szestnastkowo mov bx, ax shr ax, 12 call pc2 ; bity 12-15 ; mov ax, bx ; shr ax, 8 mov al, bh and al, 0fh call pc2 ; bity 8-11 mov al, bl shr al, 4 and al, 0fh call pc2 ; bity 4-7 mov al, bl and al, 0fh call pc2 ; bity 0-3 ret ; ======================================================= pc2: ;we: AL - cyfra hex ;wy: pisze cyfre, niszczone ax cmp al, 9 mov ah, 0eh ja hex or al, '0' jmp short PZ hex: add al, 'A'-10 PZ: int 10h ret ; ======================================================= align 16 bufor times 800h db 0 ; 2 Kilobajty plik times 80 db 0 info db 'Program usuwa podany plik.',10,13,'$' input1 db 'Podaj nazwe pliku do usuniecia: $' ;zla_nazwa db 10,13,'Zla nazwa pliku.$' blad_plik db 10,13,'Blad operacji na pliku. Kod: $'