; Program zamienia wszystkie litery w podanym pliku z wielkich na male. ; ; Skladnia: ; "na_duze" i program poprosi o nazwe pliku do przetworzenia ; "na_duze nazwa_pliku" ; ; Autor: Bogdan D. ; kontakt: bogdandr (at) op (dot) pl ; ; nasm -O999 -o na_male.com -f bin na_male.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 -> ilosc znakow linii polecen xor di, di mov bl, [si] ; pobierz pierwszy znak inc si ; i przejdz do kolejnego (spacja) mov dx, info mov ah, 9 int 21h ; wyswietl info o programie or bl,bl jz bez_arg ; sprawdz, czy cokolwiek podano nam ; na linii polecen inc si ; teraz SI -> pierwszy prawdziwy znak ; linii polecen jmp z_arg ; i skaczemy poczytac argumenty bez_arg: mov dx, input1 mov ah, 9 int 21h ; prosba o wpisanie pliku petla: xor ah, ah int 16h ; pobierz znak z klawiatury mov ah, 0eh cmp al, 1bh ; jak 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 ; czy nacisnieto BackSpace? jz bksp int 10h ; wyswietl nacisniety znak mov [plik+di], al ; zapisz wprowadzony znak cmp di, 7fh ; sprawdz, czy nie przekraczamy ; dlugosci jz input_juz inc di ; DI -> miejsce na kolejny znak jmp short petla ; czytaj kolejny bksp: ; nacisnieto BkSp or di, di jz petla ; sprawdz, czy mamy co usuwac dec di ; zmniejsz ilosc znakow wprowadzonych int 10h ; skasuj znak z ekranu mov al, ' ' int 10h mov al, 8 int 10h jmp short petla ; czytaj od nowa ; ================================ ; po wczytaniu nazwy pliku input_juz: mov ax, 3d02h ; funkcja otworz R/W,deny All mov dx, plik ; DX -> nazwa pliku int 21h ; otwieraj jnc otw_ok ; jest blad? call plik_blad ; uruchamiamy ta procedure, gdy mamy ; problem z plikiem jmp zamk_ok ; nie udalo sie otworzyc pliku. ; wychodzimy z programu otw_ok: mov bx, ax ; BX = uchwyt do pliku (file handle) mov bp, 400h ; BP = ilosc bajtow, ktore bedziemy ; naraz czytac czytaj: mov ah, 3fh ; funkcja czytania z pliku mov dx, bufor ; dokad czytamy mov cx, bp ; czytamy 1 kilobajt int 21h ; czytaj jnc czyt_ok call plik_blad czyt_ok: xor di, di ; zerujemy wskaznik do tablicy cmp ax, cx ; czy przeczytalismy tyle, ; ile chcielismy? jnz przy_eof zamiana: mov dl, [bufor+di] ; pobierz znak z bufora cmp dl, 'A' ; sprawdz, czy jest to wielka litera jb znak_ok2 cmp dl, 'Z' ja znak_ok2 or dl, 20h ; zamien litere na mala mov [bufor+di], dl ; zapisz z powrotem do bufora znak_ok: inc di ; przejdz do kolejnego znaku loop zamiana mov dx, ax ; DX = ilosc odczytanych bajtow mov ax, 4201h ; funckja DOS: idz do ... od pozycji ; biezacej w pliku ;;; mov dx, -400h ;;; mov cx, 0ffffh dec cx ; CX = -1 (po wyjsciu z pelti bylo 0) neg dx ; DX = -ilosc znakow int 21h ; cofnij sie w pliku jnc idz_ok call plik_blad idz_ok: mov dx, bufor ; te bajty bedziemy pisac do pliku mov ah, 40h ; funkcja zapisu do pliku mov cx, bp ; tyle bajtow zapiszemy (1kB) int 21h ; zapisz jmp short czytaj ; czytaj kolejna porcje przy_eof: ;;; xor di, di ; wskaznik wyzerowany juz wczesniej mov cx, ax mov bp, ax ; BP = CX = ilosc przeczytanych bajtow zamiana2: mov dl, [bufor+di] ; pobierz znak z bufora cmp dl, 'A' ; sprawdz, czy jest to wielka litera jb znak_ok2 cmp dl, 'Z' ja znak_ok2 or dl, 20h ; zamien litere na mala mov [bufor+di], dl ; zapisz z powrotem do bufora znak_ok2: inc di ; przejdz do kolejnego znaku loop zamiana2 mov dx, ax ; DX = ilosc przeczytanych bajtow ;;; mov cx, 0ffffh dec cx ; CX = -1 (po wyjsciu z petli bylo 0) mov ax, 4201h ; funkcja przejscia w inne ; miejsce pliku neg dx ; DX = -ilosc przeczytanych bajtow int 21h ; cofamy sie w pliku jnc idz_ok2 call plik_blad idz_ok2: mov ah, 40h ; funkcja zapisu do pliku mov dx, bufor ; skad zapisywac bajty mov cx, bp ; CX = BP, bo zapiszemy tyle bajtow, ; ile przeczytalismy int 21h ; zapisujemy jnc zamk call plik_blad zamk: mov ah, 3eh int 21h ; zamykamy plik jnc zamk_ok call plik_blad zamk_ok: mov ax, 4c00h int 21h ; wychodzimy z programu ; ================================= ; podano nam cos na linii polecen z_arg: xor di, di ; zerujemy wskaznik do tablicy wej: mov al, [si] ; pobieramy znak z linii polecen cmp si, 100h ; sprawdzamy, czy nie koniec ; linii polecen jz wej_juz cmp al, 0dh ; Enter oznacza koniec jz wej_juz mov [plik+di], al ; zapisujemy pobrany znak inc si ; przechodzimy na kolejny znak ; w linii polecen inc di ; przechodzimy na kolejny znak ; w 'plik' jmp short wej ; wczytujemy dalej wej_juz: jmp input_juz ; ============================= plik_blad: ; wystapil blad operacji na pliku push ax push bx mov bx, ax ; BX = kod bledu mov dx, blad_plik mov ah, 9 int 21h ; wyswietlamy info o tym, ze jest blad mov ax, bx call pl ; wyswietlamy numer bledu pop bx pop ax ret ; ============================= pl: ; pisze liczbe ( 4 znaki hex ) mov bx, ax shr ax, 12 call pc2 ; wyswietl bity 12-15 mov al, bh and al, 0fh call pc2 ; wyswietl bity 8-11 mov al, bl shr al, 4 and al, 0fh call pc2 ; wyswietl bity 4-7 mov al, bl and al, 0fh call pc2 ; wyswietl 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 400h db 0 plik times 80h db 0 info db 'Program zamienia wielkie litery w pliku na male.',10,13,'$' input1 db 'Podaj nazwe pliku do przetworzenia: $' zla_nazwa db 10,13,'Zla nazwa pliku.$' blad_plik db 10,13,'Blad operacji na pliku. Kod: $'