Advertisement
joker546645

6_3 pion

Dec 21st, 2017
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; Program gwiazdki.asm
  2. ; Wyświetlanie znaków * w takt przerwań zegarowych
  3. ; Uruchomienie w trybie rzeczywistym procesora x86
  4. ; lub na maszynie wirtualnej
  5. ; zakończenie programu po naciśnięciu klawisza 'x'
  6. ; asemblacja (MASM 4.0):     masm  gwiazdki.asm,,,;
  7. ; konsolidacja (LINK 3.60):  link  gwiazdki.obj;
  8. .386
  9. rozkazy   SEGMENT   use16
  10.           ASSUME    CS:rozkazy
  11.           ;============================================================
  12. ; procedura obsługi przerwania zegarowego
  13. obsluga_zegara      PROC
  14. ; przechowanie używanych rejestrów
  15.      push      ax              
  16.      push      bx
  17.      push      es
  18. ; wpisanie adresu pamięci ekranu do rejestru ES - pamięć
  19. ; ekranu dla trybu tekstowego zaczyna się od adresu B8000H,
  20. ; jednak do rejestru ES wpisujemy wartość B800H,
  21. ; bo w trakcie obliczenia adresuprocesor każdorazowo mnoży
  22. ; zawartość rejestru ES przez 16
  23.      mov       ax, 0B800h     ;adres pamięci ekranu
  24.      mov       es, ax
  25. ; zmienna 'licznik' zawiera adres bieżący w pamięci ekranu
  26.      mov       bx, cs:licznik
  27. ; przesłanie do pamięci ekranu kodu ASCII wyświetlanego znaku
  28. ; i kodu koloru: biały na czarnym tle (do następnego bajtu)
  29.      mov       byte PTR es:[bx], '*'         ; kod ASCII
  30.      mov       byte PTR es:[bx+1], 01010001B ; kolor
  31. ; zwiększenie o 2 adresu bieżącego w pamięci ekranu
  32.      add       bx,160  
  33. ; sprawdzenie czy adres bieżący osiągnął koniec pamięci ekranu
  34.      cmp       bx,4000        
  35.      jb        wysw_dalej     ; skok gdy nie koniec ekranu
  36. ; wyzerowanie adresu bieżącego, gdy cały ekran zapisany
  37.     add     cs:nr_kolumny, 2
  38.     mov     bx, cs:nr_kolumny    
  39.     add     bx, 320          
  40. ;zapisanie adresu bieżącego do zmiennej 'licznik'
  41.  
  42. wysw_dalej:
  43.      mov       cs:licznik,bx        
  44. ; odtworzenie rejestrów
  45.      pop       es
  46.      pop       bx
  47.      pop       ax
  48. ; skok do oryginalnej procedury obsługi przerwania zegarowego
  49.      jmp       dword PTR cs:wektor8
  50. ; dane programu ze względu na specyfikę obsługi przerwań
  51. ; umieszczone są w segmencie kodu
  52. licznik        dw   320  ; wyśietlanie począwszy od 2. wiersza
  53. wektor8        dd   ?
  54. nr_kolumny      dw 0
  55. obsluga_zegara          ENDP
  56. ;============================================================
  57. ; program główny - instalacja i deinstalacja procedury
  58. ; obsługi przerwań
  59. ; ustalenie strony nr 0 dla trybu tekstowego
  60. zacznij:
  61.      mov       al, 0      
  62.      mov       ah, 5                
  63.      int       10                  
  64.      mov       ax, 0
  65.      mov       ds,ax          ; zerowanie rejestru DS
  66. ; odczytanie zawartości wektora nr 8 i zapisanie go
  67. ; w zmiennej 'wektor8' (wektor nr 8 zajmuje w pamięci 4 bajty
  68. ; począwszy od adresu fizycznego 8 * 4 = 32)
  69.      mov       eax,ds:[32]    ; adres fizyczny 0*16 + 32 = 32
  70.      mov       cs:wektor8, eax  
  71. ; wpisanie do wektora nr 8 adresu procedury 'obsluga_zegara'
  72.      mov       ax, SEG obsluga_zegara ; część segmentowa adresu
  73.      mov       bx, OFFSET obsluga_zegara     ; offset adresu
  74.      cli       ; zablokowanie przerwań
  75. ; zapisanie adresu procedury do wektora nr 8
  76.      mov       ds:[32], bx   ; OFFSET              
  77.      mov       ds:[34], ax   ; cz. segmentowa
  78.      sti         ;odblokowanie przerwań
  79.      ; oczekiwanie na naciśnięcie klawisza 'x'
  80. aktywne_oczekiwanie:
  81.      mov ah,1            
  82.      int 16H              
  83. ; funkcja INT 16H (AH=1) BIOSu ustawia ZF=1 jeśli
  84. ; naciśnięto jakiś klawisz
  85.      jz        aktywne_oczekiwanie
  86. ; odczytanie kodu ASCII naciśniętego klawisza (INT 16H, AH=0)
  87. ; do rejestru AL
  88.      mov       ah, 0
  89.      int       16H
  90.      cmp       al, 'x'        ; porównanie z kodem litery 'x'
  91.      jne       aktywne_oczekiwanie      ; skok, gdy inny znak
  92.      ; deinstalacja procedury obsługi przerwania zegarowego
  93. ; odtworzenie oryginalnej zawartości wektora nr 8
  94.      mov       eax, cs:wektor8
  95.      cli
  96.      mov       ds:[32], eax   ; przesłanie wartości oryginalnej
  97.                               ; do wektora 8 w tablicy wektorów
  98.                               ; przerwań     sti
  99.                               ; zakończenie programu
  100.      mov       al, 0
  101.      mov       ah, 4CH
  102.      int       21H
  103. rozkazy        ENDS
  104. nasz_stos      SEGMENT   stack
  105.      db        128 dup (?)
  106. nasz_stos      ENDS
  107. END  zacznij
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement