Advertisement
Guest User

Untitled

a guest
Sep 21st, 2019
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .model tiny ;Ustawia model tiny
  2. .386 ; Bedzie korzystać z intrukcji  procesora intel 80386
  3. .code ; otwieramy sekcje kodu
  4. org 100h ; przesuwamy się o 256 bajtów żeby dane z lini poleceń nie wchodziły nam w program
  5. start:  ; otwieramy "sekcję" start
  6.  
  7. ;######################################################
  8. ;wyświetl powitanie i zapytaj o sciężkę do pliku
  9. mov ax, 3    ;
  10. int 10h      ; Czyścimy ekran
  11.  
  12. mov ah, 9                  ;
  13. mov dx, offset powitanie   ; Wyświetlamy string z tablicy powitanie na standardowym wyjściu, ciąg jest
  14. int 21h                    ; wyświetlany aż do momenty natrafienia na znak "$"
  15.  
  16. xor di, di                 ;  Operacja logiczna XOR, w tym konkretnym przypadku zeruje nam zmienne (Jeżeci cię interesuje zapraszm do google)
  17.  
  18.  
  19. ;######################################################
  20. ;pobierz nazwę pliku z standardowego wejścia
  21. odczyt_nazywy:             ; miedzy etykietami odczyt nazywy znajduje się cały kod odczytujący nazwę naszego pliku
  22.     mov ah, 1          
  23.     int 21h                ; Pobierz znak z standardowego wejścia
  24.  
  25.     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)
  26.     je zakoncz_odczyt      ; Jeżeli znak to CR to zakończ odczytywanie znaków z STDI skacząc do etykiety zakoncz_odczyt:
  27.  
  28.     mov nazwa_pliku[di], al    ;Przypisz znak do tablicy nazwa pliku
  29.  
  30.     inc di                     ; zmienia pozycję w tablicy aby odczytać kolejny znak z klawiatury (di + 1)
  31.  
  32.     cmp al, 8                  ; Sprawdz czy poprany znak to znak backspace
  33.     jne nie_cofaj              ; Jeżeli nie pomin instukcję aż do etykiety nie_cofaj
  34.         cmp di, 0              ; Jeśli di jest równe 0
  35.         je nie_cofaj           ; skocz do nie_cofaj pomijając instrukcje niżej
  36.        
  37.         dec di                 ; odejmij jeden od di
  38.         cmp di, 0              ; Jeśli di jest równe 0
  39.         je nie_cofaj           ; skocz do nie_cofaj pomijając instrukcje niżej
  40.        
  41.         mov nazwa_pliku[di], 0 ; Nadpisz wprowadzony znak na 0
  42.         dec di                 ; odjemij 1 od di
  43.        
  44.         mov ah, 2              ; zastąp wprowadzony wczęśniej znak w konsoli na 0
  45.         mov dl, 0
  46.         int 21h
  47.        
  48.         mov ah, 3              ; pobierz pozycję kursora
  49.         xor bh, bh
  50.         int 10h
  51.        
  52.         dec dl                 ; odejmij 1 od pozycji kursora w poziomie (przesuwa kursor w lewo)
  53.        
  54.         mov ah, 2              ; ustaw pozycję kursora na nową o 1 w lewo
  55.         int 10h
  56.     nie_cofaj:
  57. jmp odczyt_nazywy              ; skacze do etykiety odczyt_nazywy
  58. zakoncz_odczyt:
  59.  
  60.  
  61. mov ax, 3D00h                   ; Odczyt pliku (zwraca uchwyt do pliku do zmiennej ax)
  62. mov dx, offset nazwa_pliku      ; Pobierz adres do tablicy w której znajduję się nazwa pliku
  63. int 21h
  64.  
  65. jc blad_otwarcia                ; Jezeli nastąpi błąd odczytu funkcja zwraca 1 do Carry Flag i jc skacze do etykiety blad_otwarcia
  66.  
  67. mov bx, ax                      ; kopije uchwyt do pliku z ax do bx
  68.  
  69. mov ax, 3                       ; Czyszcze ekran
  70. int 10h
  71.  
  72. mov cx,25                       ; kopiuje 25 do zmiennej CX  informując loop że ma się wykonać 25 razy
  73. petla:
  74.     call Odczytaj_Linie         ; Wywołaj procedurę Odczytaj_Linie
  75. loop petla
  76.  
  77. petla_glowna:                   ; pętla nieskończona będzie się wykonywała dopóki nie zakończymy programu
  78.     call Sprawdz_klawisz        ; Wywołaj procedurę Sprawdz_klawisz
  79. jmp petla_glowna
  80.  
  81.  
  82.  
  83. ;######################################################
  84. ;Program skacze tu w przypadku wystapienia błędu otwarcia pliku.
  85. blad_otwarcia:
  86.  
  87.    
  88.  
  89.     mov ah, 9                       ; Wyświetla string blad_otwarcia_napis
  90.     mov dx, offset blad_otwarcia_napis
  91.     int 21h
  92.    
  93.     mov ax, 4C01h                   ; Wraca do dosa zwracając error code 1
  94.     int 21h
  95.  
  96.  
  97.  
  98. ;######################################################
  99. ;Odczytuje jedną linie tekstu i wyswietla ją na ekran
  100. ;(obsługuje zawijanie krawędziowe)
  101. Odczytaj_Linie:
  102. pusha                           ; Wysyła wszystkie rejesty na stos
  103.     xor si, si                  ; Zeruje si
  104.  
  105.     odczytaj_linie_petla:      
  106.         mov ah, 3Fh             ; Pobiera z pliku CX bajtów
  107.         mov cx, 1               ; Mówimy mu żeby pobrał 1 bajt
  108.         mov dx, offset znak     ; Mówisz mu że ma przypisac pobrany znak do zmiennej znak
  109.         int 21h
  110.        
  111.         cmp [znak], 0           ; Kiedy osiągnie koniec pliku zakańcza działanie programu
  112.         je zakoncz
  113.        
  114.         ;jc blad_odczytu            ; Jeżeli nastapi błąd odczytu znaku wywali błąd zaprogrogramowany wyżej
  115.  
  116.         mov ah, 2               ; Wyżuca pobrany znak na ekran
  117.         mov dl, [znak]
  118.         int 21h
  119.  
  120.         cmp [znak], 13           ; Sprawdza czy pobrany znak to CR
  121.         je koniec_odczytaj_linie ; Jezeli znak do CR to kończy odczyt
  122.         mov [znak], 0            ; Nadpisuje znak jako 0, aby po skończzeniu pliku nie wyświetlało ostaniej litery cały czas
  123.         inc si                   ; Dodaje jeden do SI(sprawdza ilość pobranych znaków)
  124.  
  125.         cmp si, 79               ; Sprawdza czy SI (ilość znaków jest większa niż 79)
  126.         ja koniec_odczytaj_linie ; Jeżeli ilość pobranych znaków jest większa niż 79 przerwij pobieranie znaków
  127.        
  128.     jmp odczytaj_linie_petla     ; Skocz do etykiety odczytaj_linie_petla
  129.  
  130.     koniec_odczytaj_linie:
  131. popa                            ; Pobiera wszystkie rejestry z stosu
  132. ret                             ; Wraca do miejsca wywołania procedury
  133.  
  134. ;######################################################
  135. ;Obsługa klawiszy [DOWN], [ESC]
  136. Sprawdz_klawisz:
  137. pusha                           ; Wysyła wszystkie rejesty na stos
  138.  
  139.     mov ah, 8                   ; Pobiera znak klikniety na klawiaturze bez wyświetlania go
  140.     int 21h
  141.    
  142.     cmp al, 80                  ; Sprzawdza czy znak to strzałka w dół (Kod ascii 80)
  143.     jne pomin_wdol             
  144.         call Odczytaj_Linie     ; Jeżeli kliknięto szczałkę w dół odczytaj kolejną linię i wyswitl ją na ekran
  145.     pomin_wdol:
  146.    
  147.     cmp al, 27                  ; Sprzawdza czy znak to ESC (Kod ascii 27)
  148.     jne pomin_esc
  149.         zakoncz:
  150.         mov ax, 4C00h           ; Kończy program z error level 0
  151.         int 21h
  152.     pomin_esc:
  153.    
  154. popa                            ; Pobiera wszystkie rejestry z stosu
  155. ret                             ; Wraca do miejsca wywołania procedury
  156.  
  157. .data
  158. blad_otwarcia_napis db 10,13,"Nastapil blad otwarcia pliku. Sprawdz czy podana sciezka jest poprawna",10,13,'$'
  159.  
  160.  
  161. powitanie   db "**********************************",10,13
  162.             db "*         Czytnik Plikow       *",10,13
  163.             db "**********************************",10,10,13
  164.             db "Podaj sciezke do pliku tekstowego:",10,13,"$"
  165.  
  166. nazwa_pliku db 51 dup(0) ; Tablica 51 elemntów wypełniona zerami do której zapiszemy nazwe naszego pliku
  167. znak db "$"              ; Zmienna do której przypisujemy nasz pobrany znak
  168. end start                ; Konczymy segment start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement