; Program usuwa zawartosc podanego pliku i, pozniej, podany plik. ; ; Składnia: ; "usun" i program poprosi o nazwe pliku do usuniecia ; "usun nazwa_pliku" ; ; Autor: Bogdan D. ; kontakt: bogdandr@op.pl ; ; nasm -O999 -f elf usun.asm ; ld -s -o usun usun.o ; ; 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 section .text global _start _start: push ebp mov ebp, esp %idefine argc ebp+4 %idefine argv ebp+8 mov eax, 4 ; funkcja zapisu do pliku mov ebx, 1 ; stdout (ekran) mov ecx, info ; napis mov edx, info_dl ; ile bajtow piszemy int 80h ; wyswietlamy prosbe o nazwe pliku mov eax, [argc] ;sprawdzamy, ile podano nam argumentow cmp eax, 1 ja z_arg mov eax, 4 ; funkcja zapisu do pliku mov ebx, 1 ; stdout (ekran) mov ecx, input1 ; napis mov edx, input1_dl ; ile bajtow piszemy int 80h ; wyswietlamy prosbe o nazwe pliku mov eax, 3 ; funkcja odczytu z pliku xor ebx, ebx ; EBX = 0 = stdin (klawiatura) mov ecx, plik ; gdzie zapisujemy odczytane dane mov edx, 100h ; ile bajtow chcemy int 80h ; wykonaj mov byte [plik+0ffh], 0 ; na wszelki wypadek mov byte [plik+eax-1], 0 input_juz: mov eax, 5 ; funkcja otwarcia pliku mov ebx, plik ; nazwa pliku, ktory chcemy otworzyc mov ecx, 2 ; odczyt i zapis mov edx, 600q ; - RW- --- --- int 80h cmp eax, 0 ; sprawdzamy, czy nie wystapil blad jge otw_ok call plik_blad jmp usuw_ok ; nie udalo sie otw.pliku. wychodzimy. otw_ok: mov ebx, eax xor esi, esi ; ==================================== ; najpierw obliczymy dlugosc calego pliku w kB ; EBX ma juz deskryptor pliku mov ecx, bufor ; dokad czytac mov edx, 400h ; ile czytac policz: mov eax, 3 ; funkcja czytania z pliku int 80h cmp eax, 0 ; sprawdzamy, czy nie wystapil blad jge czyt_ok call plik_blad jmp zamk czyt_ok: cmp eax, edx ; czy przeczytalismy tyle, ; ile chcielismy? jb policz_juz ; jesli tak, to plik sie skonczyl inc esi ; zwieksz licznik kilobajtow jmp short policz policz_juz: ; rozmiar pliku = ESI * 1024 + EAX mov edi, eax ; EDI = reszta ; ==================================== mov eax, 19 ; funkcja przechodzenia w pliku ; EBX = deskryptor xor ecx, ecx ; przechodzimy o zero bajtow xor edx, edx ; od poczatku pliku int 80h mov ecx, bufor+400h ; ECX -> dane ( same zera ) test esi, esi ; sprawdzamy wyliczona dlugosc pliku jz reszta ; jesli nie było co najmniej 1 kB mov edx, 400h ; ilosc bajtow do zapisania zapisz: mov eax, 4 ; funkcja zapisu do pliku ; EBX ma deskryptor int 80h cmp eax, 0 ; sprawdzamy, czy nie wystapil blad jge zapis_ok call plik_blad jmp zamk zapis_ok: dec esi jnz zapisz ; ==================================== ; zapisujemy resztke zer do pliku reszta: mov eax, 4 ; funkcja zapisu do pliku ; EBX ma deskryptor ; ECX = bufor + 400h mov edx, edi ; EDX = pozostala ilosc bajtow ; do zapisania int 80h cmp eax, 0 ; sprawdzamy, czy nie wystapil blad jge zapis2_ok call plik_blad zapis2_ok: mov eax, 19 ; funkcja przechodzenia w pliku ; EBX = deskryptor xor ecx, ecx ; przechodzimy o zero bajtow xor edx, edx ; od poczatku pliku int 80h mov eax, 4 ; funkcja zapisu do pliku ; EBX ma deskryptor ; ECX = bufor + 400h xor edx, edx ; zapisujemy zero bajtow, ; skracajac w ten ; sposob plik do dlugosci 0. int 80h ; ********************************** zamk: mov eax, 6 ; zamykamy plik int 80h cmp eax, 0 ; sprawdzamy, czy nie wystapil blad jge zamk_ok call plik_blad zamk_ok: ; usuwamy plik: mov eax, 10 ; funkcja usuwania pliku mov ebx, plik ; adres nazwy pliku int 80h cmp eax, 0 ; sprawdzamy, czy nie wystapil blad jge usuw_ok call plik_blad usuw_ok: mov eax, 1 ; wyjscie z programu xor ebx, ebx int 80h ;************************************** z_arg: cld mov al, 0 mov esi, [argv+4] mov edi, [argv+4] mov ecx, 100h repne scasb ; znajdz koniec argumentu ; pierwszy arg. to nazwa programu mov ecx, edi ; przepisz drugi arg. do nazwy pliku sub ecx, esi inc ecx mov edi, plik rep movsb mov byte [plik+0ffh], 0 jmp input_juz ;************************************** plik_blad: push eax push ebx push ecx push edx push esi mov esi, eax mov eax, 4 ; funkcja zapisu do pliku mov ebx, 1 ; na ekran mov ecx, blad_plik ; co napisac mov edx, blad_plik_dl ; ile napisac int 80h ; wykonaj mov eax, esi call _pisz_ld mov eax, 4 ; funkcja zapisu do pliku mov ebx, 1 ; na ekran mov ecx, blad_plik ; co napisac mov edx, 1 ; ile napisac (tylko znak nowej linii) int 80h ; wykonaj pop esi pop edx pop ecx pop ebx pop eax ret ;************************************** _pisz_ld: ; pisz32e ; we: EAX=liczba bez znaku do wypisania pushfd push ecx push edx push eax push esi xor esi, esi mov ecx, 10 ._pisz_ld_petla: xor edx, edx div ecx or dl, '0' mov [_pisz_bufor+esi], dl ; do bufora ida reszty z ; dzielenia przez 10, inc esi ; czyli cyfry wspak test eax, eax jnz ._pisz_ld_petla ._pisz_ld_wypis: mov al, [_pisz_bufor+esi-1] ; wypisujemy reszty wspak call _pisz_z dec esi jnz ._pisz_ld_wypis pop esi pop eax pop edx pop ecx popfd ret ;************************************** _pisz_z: ; pisz_z ; we: AL=znak do wypisania push eax push ebx push ecx push edx mov [_pisz_bufor+39], al mov eax, 4 ; funkcja zapisu do pliku mov ebx, 1 ; kierujemy na standardowe wyjscie lea ecx, [_pisz_bufor+39] ; mowimy, co chcemy napisac mov edx, 1 ; ile bajtow? int 80h pop edx pop ecx pop ebx pop eax ret ; ========================================================== section .data plik times 100h db 0 info db 'Program usuwa podany plik.',10 info_dl equ $ - info input1 db 'Podaj nazwe pliku do usuniecia: ' input1_dl equ $ - input1 blad_plik db 10,'Blad operacji na pliku. Kod: ' blad_plik_dl equ $ - blad_plik _pisz_bufor times 40 db 0 section .bss bufor resb 800h