Advertisement
Guest User

Untitled

a guest
Jan 19th, 2017
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.62 KB | None | 0 0
  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.  
  13. wyswietl_AL PROC
  14. ; wyświetlanie zawartości rejestru AL na ekranie wg adresu
  15. ; podanego w ES:BX
  16. ; stosowany jest bezpośredni zapis do pamięci ekranu
  17. ; przechowanie rejestrów
  18. push cx
  19. push dx
  20.  
  21. mov cl, 10 ; dzielnik
  22.  
  23. mov ah, 0 ; zerowanie starszej części dzielnej
  24. ; dzielenie liczby w AX przez liczbę w CL, iloraz w AL,
  25. ; reszta w AH (tu: dzielenie przez 10)
  26. div cl
  27. add ah, 30H ; zamiana na kod ASCII
  28. mov es:[bx+4], ah ; cyfra jedności
  29. mov ah, 0
  30. div cl ; drugie dzielenie przez 10
  31. add ah, 30H ; zamiana na kod ASCII
  32. mov es:[bx+2], ah ; cyfra dziesiątek
  33. add al, 30H ; zamiana na kod ASCII
  34. mov es:[bx+0], al ; cyfra setek
  35. ; wpisanie kodu koloru (intensywny biały) do pamięci ekranu
  36. mov al, 00001111B
  37. mov es:[bx+1],al
  38. mov es:[bx+3],al
  39. mov es:[bx+5],al
  40.  
  41. ; odtworzenie rejestrów
  42. pop dx
  43. pop cx
  44. ret ; wyjście z podprogramu
  45. wyswietl_AL ENDP
  46. ;============================================================
  47.  
  48.  
  49.  
  50. obsluga_klawiatury PROC
  51. ; przechowanie używanych rejestrów
  52. push ax
  53. push bx
  54.  
  55. in al, 60h
  56. cmp al, 185
  57. jne dalej1
  58. mov bl, cs:stan
  59. not bl
  60. and bl, 00000001b
  61. mov cs:stan, bl
  62.  
  63. dalej1:
  64. pop bx
  65. pop ax
  66. jmp dword PTR cs:wektor9
  67.  
  68. stan db 1
  69. wektor9 dd ?
  70. obsluga_klawiatury ENDP
  71.  
  72.  
  73.  
  74. ;============================================================
  75. ; procedura obsługi przerwania zegarowego
  76. obsluga_zegara PROC
  77. ; przechowanie używanych rejestrów
  78. push ax
  79. push bx
  80. push es
  81. ; wpisanie adresu pamięci ekranu do rejestru ES - pamięć
  82. ; ekranu dla trybu tekstowego zaczyna się od adresu B8000H,
  83. ; jednak do rejestru ES wpisujemy wartość B800H,
  84. ; bo w trakcie obliczenia adresu procesor każdorazowo mnoży
  85. ; zawartość rejestru ES przez 16
  86.  
  87.  
  88. cmp stan, 0
  89. je dalej
  90. inc cs:licznik
  91. dalej:
  92. mov ax, 0B800h ;adres pamięci ekranu
  93. mov es, ax
  94. mov al, cs:licznik
  95. call wyswietl_AL
  96.  
  97. ; odtworzenie rejestrów
  98. pop es
  99. pop bx
  100. pop ax
  101. ; skok do oryginalnej procedury obsługi przerwania zegarowego
  102. jmp dword PTR cs:wektor8
  103. ; dane programu ze względu na specyfikę obsługi przerwań
  104. ; umieszczone są w segmencie kodu
  105. licznik db 0 ; wyświetlanie począwszy od 2. wiersza
  106. wektor8 dd ?
  107. obsluga_zegara ENDP
  108.  
  109.  
  110.  
  111. ;============================================================
  112. ; program główny - instalacja i deinstalacja procedury
  113. ; obsługi przerwań
  114. ; ustalenie strony nr 0 dla trybu tekstowego
  115. zacznij:
  116. mov al, 0
  117. mov ah, 5
  118. int 10
  119. mov ax, 0
  120. mov ds,ax ; zerowanie rejestru DS
  121. ; odczytanie zawartości wektora nr 8 i zapisanie go
  122. ; w zmiennej 'wektor8' (wektor nr 8 zajmuje w pamięci 4 bajty
  123. ; począwszy od adresu fizycznego 8 * 4 = 32)
  124. mov eax,ds:[32] ; adres fizyczny 0*16 + 32 = 32
  125. mov cs:wektor8, eax
  126.  
  127. ; wpisanie do wektora nr 8 adresu procedury 'obsluga_zegara'
  128. mov ax, SEG obsluga_zegara ; część segmentowa adresu
  129. mov bx, OFFSET obsluga_zegara ; offset adresu
  130. cli ; zablokowanie przerwań
  131. ; zapisanie adresu procedury do wektora nr 8
  132. mov ds:[32], bx ; OFFSET
  133. mov ds:[34], ax ; cz. segmentowa
  134. sti ;odblokowanie przerwań
  135.  
  136.  
  137.  
  138. mov eax,ds:[36] ; adres fizyczny 0*16 + 32 = 32
  139. mov cs:wektor9, eax
  140.  
  141. ; wpisanie do wektora nr 8 adresu procedury 'obsluga_zegara'
  142. mov ax, SEG obsluga_klawiatury ; część segmentowa adresu
  143. mov bx, OFFSET obsluga_klawiatury ; offset adresu
  144. cli ; zablokowanie przerwań
  145. ; zapisanie adresu procedury do wektora nr 8
  146. mov ds:[36], bx ; OFFSET
  147. mov ds:[38], ax ; cz. segmentowa
  148. sti ;odblokowanie przerwań
  149.  
  150.  
  151.  
  152. ; oczekiwanie na naciśnięcie klawisza 'x'
  153. aktywne_oczekiwanie:
  154. mov ah,1
  155. int 16H
  156. ; funkcja INT 16H (AH=1) BIOSu ustawia ZF=1 jeśli
  157. ; naciśnięto jakiś klawisz
  158. jz aktywne_oczekiwanie
  159. ; odczytanie kodu ASCII naciśniętego klawisza (INT 16H, AH=0)
  160. ; do rejestru AL
  161. mov ah, 0
  162. int 16H
  163. cmp al, 'x' ; porównanie z kodem litery 'x'
  164. jne aktywne_oczekiwanie ; skok, gdy inny znak
  165. ; deinstalacja procedury obsługi przerwania zegarowego
  166. ; odtworzenie oryginalnej zawartości wektora nr 8
  167. mov eax, cs:wektor8
  168.  
  169. cli
  170. mov ds:[32], eax ; przesłanie wartości oryginalnej
  171. ; do wektora 8 w tablicy wektorów
  172. ; przerwań
  173. sti
  174.  
  175.  
  176. mov eax, cs:wektor9
  177. cli
  178. mov ds:[36], eax
  179. sti
  180. ; zakończenie programu
  181. mov al, 0
  182. mov ah, 4CH
  183. int 21H
  184. rozkazy ENDS
  185.  
  186. nasz_stos SEGMENT stack
  187. db 128 dup (?)
  188. nasz_stos ENDS
  189. END zacznij
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement