Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .model tiny ;Ustawia model tiny
- .386 ; Bedzie korzystać z intrukcji procesora intel 80386
- .code ; otwieramy sekcje kodu
- org 100h ; przesuwamy się o 256 bajtów żeby dane z lini poleceń nie wchodziły nam w program
- start: ; otwieramy "sekcję" start
- ;######################################################
- ;wyświetl powitanie i zapytaj o sciężkę do pliku
- mov ax, 3 ;
- int 10h ; Czyścimy ekran
- mov ah, 9 ;
- mov dx, offset powitanie ; Wyświetlamy string z tablicy powitanie na standardowym wyjściu, ciąg jest
- int 21h ; wyświetlany aż do momenty natrafienia na znak "$"
- xor di, di ; Operacja logiczna XOR, w tym konkretnym przypadku zeruje nam zmienne (Jeżeci cię interesuje zapraszm do google)
- ;######################################################
- ;pobierz nazwę pliku z standardowego wejścia
- odczyt_nazywy: ; miedzy etykietami odczyt nazywy znajduje się cały kod odczytujący nazwę naszego pliku
- mov ah, 1
- int 21h ; Pobierz znak z standardowego wejścia
- cmp al, 13 ; sprawdz czy pobrany znak to znak powrotu karetki (zawsze wystepuja obok siebie dwa znaki 10 i 13 jeden to new line drugi to carriage return)
- je zakoncz_odczyt ; Jeżeli znak to CR to zakończ odczytywanie znaków z STDI skacząc do etykiety zakoncz_odczyt:
- mov nazwa_pliku[di], al ;Przypisz znak do tablicy nazwa pliku
- inc di ; zmienia pozycję w tablicy aby odczytać kolejny znak z klawiatury (di + 1)
- cmp al, 8 ; Sprawdz czy poprany znak to znak backspace
- jne nie_cofaj ; Jeżeli nie pomin instukcję aż do etykiety nie_cofaj
- cmp di, 0 ; Jeśli di jest równe 0
- je nie_cofaj ; skocz do nie_cofaj pomijając instrukcje niżej
- dec di ; odejmij jeden od di
- cmp di, 0 ; Jeśli di jest równe 0
- je nie_cofaj ; skocz do nie_cofaj pomijając instrukcje niżej
- mov nazwa_pliku[di], 0 ; Nadpisz wprowadzony znak na 0
- dec di ; odjemij 1 od di
- mov ah, 2 ; zastąp wprowadzony wczęśniej znak w konsoli na 0
- mov dl, 0
- int 21h
- mov ah, 3 ; pobierz pozycję kursora
- xor bh, bh
- int 10h
- dec dl ; odejmij 1 od pozycji kursora w poziomie (przesuwa kursor w lewo)
- mov ah, 2 ; ustaw pozycję kursora na nową o 1 w lewo
- int 10h
- nie_cofaj:
- jmp odczyt_nazywy ; skacze do etykiety odczyt_nazywy
- zakoncz_odczyt:
- mov ax, 3D00h ; Odczyt pliku (zwraca uchwyt do pliku do zmiennej ax)
- mov dx, offset nazwa_pliku ; Pobierz adres do tablicy w której znajduję się nazwa pliku
- int 21h
- jc blad_otwarcia ; Jezeli nastąpi błąd odczytu funkcja zwraca 1 do Carry Flag i jc skacze do etykiety blad_otwarcia
- mov bx, ax ; kopije uchwyt do pliku z ax do bx
- mov ax, 3 ; Czyszcze ekran
- int 10h
- mov cx,25 ; kopiuje 25 do zmiennej CX informując loop że ma się wykonać 25 razy
- petla:
- call Odczytaj_Linie ; Wywołaj procedurę Odczytaj_Linie
- loop petla
- petla_glowna: ; pętla nieskończona będzie się wykonywała dopóki nie zakończymy programu
- call Sprawdz_klawisz ; Wywołaj procedurę Sprawdz_klawisz
- jmp petla_glowna
- ;######################################################
- ;Program skacze tu w przypadku wystapienia błędu otwarcia pliku.
- blad_otwarcia:
- mov ah, 9 ; Wyświetla string blad_otwarcia_napis
- mov dx, offset blad_otwarcia_napis
- int 21h
- mov ax, 4C01h ; Wraca do dosa zwracając error code 1
- int 21h
- ;######################################################
- ;Odczytuje jedną linie tekstu i wyswietla ją na ekran
- ;(obsługuje zawijanie krawędziowe)
- Odczytaj_Linie:
- pusha ; Wysyła wszystkie rejesty na stos
- xor si, si ; Zeruje si
- odczytaj_linie_petla:
- mov ah, 3Fh ; Pobiera z pliku CX bajtów
- mov cx, 1 ; Mówimy mu żeby pobrał 1 bajt
- mov dx, offset znak ; Mówisz mu że ma przypisac pobrany znak do zmiennej znak
- int 21h
- cmp [znak], 0 ; Kiedy osiągnie koniec pliku zakańcza działanie programu
- je zakoncz
- ;jc blad_odczytu ; Jeżeli nastapi błąd odczytu znaku wywali błąd zaprogrogramowany wyżej
- mov ah, 2 ; Wyżuca pobrany znak na ekran
- mov dl, [znak]
- int 21h
- cmp [znak], 13 ; Sprawdza czy pobrany znak to CR
- je koniec_odczytaj_linie ; Jezeli znak do CR to kończy odczyt
- mov [znak], 0 ; Nadpisuje znak jako 0, aby po skończzeniu pliku nie wyświetlało ostaniej litery cały czas
- inc si ; Dodaje jeden do SI(sprawdza ilość pobranych znaków)
- cmp si, 79 ; Sprawdza czy SI (ilość znaków jest większa niż 79)
- ja koniec_odczytaj_linie ; Jeżeli ilość pobranych znaków jest większa niż 79 przerwij pobieranie znaków
- jmp odczytaj_linie_petla ; Skocz do etykiety odczytaj_linie_petla
- koniec_odczytaj_linie:
- popa ; Pobiera wszystkie rejestry z stosu
- ret ; Wraca do miejsca wywołania procedury
- ;######################################################
- ;Obsługa klawiszy [DOWN], [ESC]
- Sprawdz_klawisz:
- pusha ; Wysyła wszystkie rejesty na stos
- mov ah, 8 ; Pobiera znak klikniety na klawiaturze bez wyświetlania go
- int 21h
- cmp al, 80 ; Sprzawdza czy znak to strzałka w dół (Kod ascii 80)
- jne pomin_wdol
- call Odczytaj_Linie ; Jeżeli kliknięto szczałkę w dół odczytaj kolejną linię i wyswitl ją na ekran
- pomin_wdol:
- cmp al, 27 ; Sprzawdza czy znak to ESC (Kod ascii 27)
- jne pomin_esc
- zakoncz:
- mov ax, 4C00h ; Kończy program z error level 0
- int 21h
- pomin_esc:
- popa ; Pobiera wszystkie rejestry z stosu
- ret ; Wraca do miejsca wywołania procedury
- .data
- blad_otwarcia_napis db 10,13,"Nastapil blad otwarcia pliku. Sprawdz czy podana sciezka jest poprawna",10,13,'$'
- powitanie db "**********************************",10,13
- db "* Czytnik Plikow *",10,13
- db "**********************************",10,10,13
- db "Podaj sciezke do pliku tekstowego:",10,13,"$"
- nazwa_pliku db 51 dup(0) ; Tablica 51 elemntów wypełniona zerami do której zapiszemy nazwe naszego pliku
- znak db "$" ; Zmienna do której przypisujemy nasz pobrany znak
- end start ; Konczymy segment start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement