Advertisement
joker546645

6_2 sek

Dec 21st, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; Program gwiazdki.asm
  2. ; Wywietlanie znaków * w takt przerwa zegarowych Uruchomienie w trybie rzeczywistym procesora x86 lub na maszynie wirtualnej
  3. ; zakoczenie programu po naciniciu klawisza 'x'
  4. ; asemblacja (MASM 4.0):     masm  gwiazdki.asm,,,;
  5. ; konsolidacja (LINK 3.60):  link  gwiazdki.obj;
  6.  
  7. .386
  8. rozkazy  SEGMENT  use16
  9. ASSUME  CS:rozkazy
  10.  
  11. ;============================================================
  12. ; procedura obsługi przerwania zegarowego
  13.  
  14. obsluga_zegara   PROC
  15.     ; przechowanie uywanych rejestrów
  16.  
  17.     push   ax      
  18.     push   bx
  19.     push   es
  20.  
  21.     add cs:czasomierz, 1
  22.     cmp cs:czasomierz, 19
  23.     jb jeszcze_nie
  24.     mov cs:czasomierz, 0
  25.  
  26.     ; wpisanie adresu pamici ekranu do rejestru ES - pami ekranu dla trybu tekstowego zaczyna si od adresu B8000H, jednak do rejestru ES wpisujemy warto B800H,
  27.     ; bo w trakcie obliczenia adresu procesor kadorazowo mnoy  zawarto rejestru ES przez 16
  28.     mov    ax, 0B800h  ;adres pamici ekranu
  29.     mov    es, ax
  30.  
  31.     ; zmienna 'licznik' zawiera adres biecy w pamici ekranu
  32.     mov    bx, cs:licznik
  33.  
  34.     ; przesłanie do pamici ekranu kodu ASCII wywietlanego znaku i kodu koloru: biały na czarnym tle (do nastpnego bajtu)
  35.     mov    byte PTR es:[bx], '*'    ; kod ASCII
  36.     mov    byte PTR es:[bx+1], 00010110B ; kolor
  37.    
  38.     ; zwikszenie o 2 adresu biecego w pamici ekranu
  39.     add    bx,2  
  40.  
  41.     ; sprawdzenie czy adres biecy osignł koniec pamici ekranu
  42.     cmp    bx,4000      
  43.     jb    wysw_dalej  ; skok gdy nie koniec ekranu
  44.  
  45.     ; wyzerowanie adresu biecego, gdy cały ekran zapisany
  46.     mov    bx, 0    
  47.  
  48.     ;zapisanie adresu biecego do zmiennej 'licznik'
  49. wysw_dalej:
  50.     mov    cs:licznik, bx        
  51.  
  52.     ; odtworzenie rejestrów
  53. jeszcze_nie:
  54.     pop    es
  55.     pop    bx
  56.     pop    ax
  57.  
  58.     ; skok do oryginalnej procedury obsługi przerwania zegarowego
  59.     jmp    dword PTR cs:wektor8
  60.  
  61.     ; dane programu ze wzgldu na specyfik obsługi przerwa
  62.     ; umieszczone s w segmencie kodu
  63.     licznik    dw  320  ; wywietlanie poczwszy od 2. wiersza
  64.     wektor8    dd  ?
  65.     czasomierz db 0
  66.  
  67. obsluga_zegara          ENDP
  68.  
  69. ;============================================================
  70. ; program główny - instalacja i deinstalacja procedury  obsługi przerwa
  71.  
  72.     ; ustalenie strony nr 0 dla trybu tekstowego
  73. zacznij:
  74.     mov    al, 0  
  75.     mov    ah, 5                
  76.     int    10                  
  77.  
  78.     mov    ax, 0
  79.     mov    ds,ax    ; zerowanie rejestru DS
  80.  
  81.  
  82.     ; odczytanie zawartoci wektora nr 8 i zapisanie go w zmiennej 'wektor8' (wektor nr 8 zajmuje w pamici 4 bajty poczwszy od adresu fizycznego 8 * 4 = 32)
  83.     mov    eax,ds:[32]  ; adres fizyczny 0*16 + 32 = 32
  84.     mov    cs:wektor8, eax  
  85.      
  86.     ; wpisanie do wektora nr 8 adresu procedury 'obsluga_zegara'
  87.     mov    ax, SEG obsluga_zegara ; cz segmentowa adresu
  88.     mov    bx, OFFSET obsluga_zegara  ; offset adresu
  89.  
  90.     cli    ; zablokowanie przerwa  
  91.  
  92.     ; zapisanie adresu procedury do wektora nr 8
  93.     mov    ds:[32], bx   ; OFFSET          
  94.     mov    ds:[34], ax   ; cz. segmentowa
  95.  
  96.     sti      ;odblokowanie przerwa
  97.  
  98.    
  99.     ; oczekiwanie na nacinicie klawisza 'x'
  100. aktywne_oczekiwanie:
  101.     mov ah,1      
  102.     int 16H              
  103.     ; funkcja INT 16H (AH=1) BIOSu ustawia ZF=1 jeli nacinito jaki klawisz
  104.     jz    aktywne_oczekiwanie
  105.  
  106.     ; odczytanie kodu ASCII nacinitego klawisza (INT 16H, AH=0)  do rejestru AL
  107.     mov    ah, 0
  108.     int    16H
  109.     cmp    al, 'x'    ; porównanie z kodem litery 'x'
  110.     jne    aktywne_oczekiwanie   ; skok, gdy inny znak ; deinstalacja procedury obsługi przerwania zegarowego
  111.  
  112.     ; odtworzenie oryginalnej zawartoci wektora nr 8
  113.     mov    eax, cs:wektor8
  114.     cli
  115.     mov    ds:[32], eax  ; przesłanie wartoci oryginalnej do wektora 8 w tablicy wektorów przerwa
  116.     sti
  117.  
  118.     ; zakoczenie programu
  119.     mov    al, 0
  120.     mov    ah, 4CH
  121.     int    21H
  122. rozkazy    ENDS
  123.    
  124. nasz_stos   SEGMENT  stack
  125.     db    128 dup (?)
  126. nasz_stos   ENDS
  127.  
  128. END  zacznij
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement