Advertisement
joker546645

6_1 kolor

Dec 21st, 2017
95
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,2  
  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.      mov       bx, 0          
  38. ;zapisanie adresu bieżącego do zmiennej 'licznik'
  39.  
  40. wysw_dalej:
  41.      mov       cs:licznik,bx        
  42. ; odtworzenie rejestrów
  43.      pop       es
  44.      pop       bx
  45.      pop       ax
  46. ; skok do oryginalnej procedury obsługi przerwania zegarowego
  47.      jmp       dword PTR cs:wektor8
  48. ; dane programu ze względu na specyfikę obsługi przerwań
  49. ; umieszczone są w segmencie kodu
  50. licznik        dw   320  ; wyśietlanie począwszy od 2. wiersza
  51. wektor8        dd   ?
  52. obsluga_zegara          ENDP
  53. ;============================================================
  54. ; program główny - instalacja i deinstalacja procedury
  55. ; obsługi przerwań
  56. ; ustalenie strony nr 0 dla trybu tekstowego
  57. zacznij:
  58.      mov       al, 0      
  59.      mov       ah, 5                
  60.      int       10                  
  61.      mov       ax, 0
  62.      mov       ds,ax          ; zerowanie rejestru DS
  63. ; odczytanie zawartości wektora nr 8 i zapisanie go
  64. ; w zmiennej 'wektor8' (wektor nr 8 zajmuje w pamięci 4 bajty
  65. ; począwszy od adresu fizycznego 8 * 4 = 32)
  66.      mov       eax,ds:[32]    ; adres fizyczny 0*16 + 32 = 32
  67.      mov       cs:wektor8, eax  
  68. ; wpisanie do wektora nr 8 adresu procedury 'obsluga_zegara'
  69.      mov       ax, SEG obsluga_zegara ; część segmentowa adresu
  70.      mov       bx, OFFSET obsluga_zegara     ; offset adresu
  71.      cli       ; zablokowanie przerwań
  72. ; zapisanie adresu procedury do wektora nr 8
  73.      mov       ds:[32], bx   ; OFFSET              
  74.      mov       ds:[34], ax   ; cz. segmentowa
  75.      sti         ;odblokowanie przerwań
  76.      ; oczekiwanie na naciśnięcie klawisza 'x'
  77. aktywne_oczekiwanie:
  78.      mov ah,1            
  79.      int 16H              
  80. ; funkcja INT 16H (AH=1) BIOSu ustawia ZF=1 jeśli
  81. ; naciśnięto jakiś klawisz
  82.      jz        aktywne_oczekiwanie
  83. ; odczytanie kodu ASCII naciśniętego klawisza (INT 16H, AH=0)
  84. ; do rejestru AL
  85.      mov       ah, 0
  86.      int       16H
  87.      cmp       al, 'x'        ; porównanie z kodem litery 'x'
  88.      jne       aktywne_oczekiwanie      ; skok, gdy inny znak
  89.      ; deinstalacja procedury obsługi przerwania zegarowego
  90. ; odtworzenie oryginalnej zawartości wektora nr 8
  91.      mov       eax, cs:wektor8
  92.      cli
  93.      mov       ds:[32], eax   ; przesłanie wartości oryginalnej
  94.                               ; do wektora 8 w tablicy wektorów
  95.                               ; przerwań     sti
  96.                               ; zakończenie programu
  97.      mov       al, 0
  98.      mov       ah, 4CH
  99.      int       21H
  100. rozkazy        ENDS
  101. nasz_stos      SEGMENT   stack
  102.      db        128 dup (?)
  103. nasz_stos      ENDS
  104. END  zacznij
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement