Advertisement
Guest User

Untitled

a guest
Jan 5th, 2019
147
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 adresu procesor 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], 00011110B ; kolor
  31.  
  32. ; zwiększenie o 2 adresu bieżącego w pamięci ekranu
  33.  add bx,2
  34. ; sprawdzenie czy adres bieżący osiągnął koniec pamięci ekranu
  35.  cmp bx,4000
  36.  jb wysw_dalej ; skok gdy nie koniec ekranu
  37. ; wyzerowanie adresu bieżącego, gdy cały ekran zapisany
  38.  mov bx, 0
  39. ;zapisanie adresu bieżącego do zmiennej 'licznik'
  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świetlanie 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.  
  69. ; wpisanie do wektora nr 8 adresu procedury 'obsluga_zegara'
  70.  mov ax, SEG obsluga_zegara ; część segmentowa adresu
  71.  mov bx, OFFSET obsluga_zegara ; offset adresu
  72.  cli ; zablokowanie przerwań
  73. ; zapisanie adresu procedury do wektora nr 8
  74.  mov ds:[32], bx ; OFFSET
  75.  mov ds:[34], ax ; cz. segmentowa
  76.  sti ;odblokowanie przerwań
  77.  
  78. ; oczekiwanie na naciśnięcie klawisza 'x'
  79. aktywne_oczekiwanie:
  80.  mov ah,1
  81.  int 16H
  82. ; funkcja INT 16H (AH=1) BIOSu ustawia ZF=1 jeśli
  83. ; naciśnięto jakiś klawisz
  84.  jz aktywne_oczekiwanie
  85. ; odczytanie kodu ASCII naciśniętego klawisza (INT 16H, AH=0)
  86. ; do rejestru AL
  87.  mov ah, 0
  88.  int 16H
  89.  cmp al, 'x' ; porównanie z kodem litery 'x'
  90.  jne aktywne_oczekiwanie ; skok, gdy inny znak
  91. ; deinstalacja procedury obsługi przerwania zegarowego
  92. ; odtworzenie oryginalnej zawartości wektora nr 8
  93.  mov eax, cs:wektor8
  94.  cli
  95.  mov ds:[32], eax ; przesłanie wartości oryginalnej
  96.  ; do wektora 8 w tablicy wektorów
  97.  ; przerwań
  98.  sti
  99. ; zakończenie programu
  100.  mov al, 0
  101.  mov ah, 4CH
  102.  int 21H
  103. rozkazy ENDS
  104.  
  105. nasz_stos SEGMENT stack
  106.  db 128 dup (?)
  107. nasz_stos ENDS
  108. END zacznij
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement