Advertisement
Guest User

Untitled

a guest
Jan 19th, 2017
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.80 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, 57 ;wcisniecie
  57. jne dalej1
  58. cmp cs:wcisniety, 0
  59. jne dalej1
  60.  
  61. mov cs:wcisniety, 1
  62. mov bl, cs:stan
  63. not bl
  64. and bl, 00000001b
  65. mov cs:stan, bl
  66.  
  67. dalej1:
  68. cmp al, 185
  69. jne dalej2
  70. mov bl, cs:wcisniety
  71. not bl
  72. and bl, 00000001b
  73. mov cs:wcisniety, bl
  74.  
  75. dalej2:
  76. pop bx
  77. pop ax
  78. jmp dword PTR cs:wektor9
  79.  
  80. stan db 1
  81. wcisniety db 0
  82. wektor9 dd ?
  83. obsluga_klawiatury ENDP
  84.  
  85.  
  86.  
  87. ;============================================================
  88. ; procedura obsługi przerwania zegarowego
  89. obsluga_zegara PROC
  90. ; przechowanie używanych rejestrów
  91. push ax
  92. push bx
  93. push es
  94. ; wpisanie adresu pamięci ekranu do rejestru ES - pamięć
  95. ; ekranu dla trybu tekstowego zaczyna się od adresu B8000H,
  96. ; jednak do rejestru ES wpisujemy wartość B800H,
  97. ; bo w trakcie obliczenia adresu procesor każdorazowo mnoży
  98. ; zawartość rejestru ES przez 16
  99.  
  100.  
  101. cmp stan, 0
  102. je dalej
  103. inc cs:licznik
  104. dalej:
  105. mov ax, 0B800h ;adres pamięci ekranu
  106. mov es, ax
  107. mov al, cs:licznik
  108. call wyswietl_AL
  109.  
  110. ; odtworzenie rejestrów
  111. pop es
  112. pop bx
  113. pop ax
  114. ; skok do oryginalnej procedury obsługi przerwania zegarowego
  115. jmp dword PTR cs:wektor8
  116. ; dane programu ze względu na specyfikę obsługi przerwań
  117. ; umieszczone są w segmencie kodu
  118. licznik db 0 ; wyświetlanie począwszy od 2. wiersza
  119. wektor8 dd ?
  120. obsluga_zegara ENDP
  121.  
  122.  
  123.  
  124. ;============================================================
  125. ; program główny - instalacja i deinstalacja procedury
  126. ; obsługi przerwań
  127. ; ustalenie strony nr 0 dla trybu tekstowego
  128. zacznij:
  129. mov al, 0
  130. mov ah, 5
  131. int 10
  132. mov ax, 0
  133. mov ds,ax ; zerowanie rejestru DS
  134. ; odczytanie zawartości wektora nr 8 i zapisanie go
  135. ; w zmiennej 'wektor8' (wektor nr 8 zajmuje w pamięci 4 bajty
  136. ; począwszy od adresu fizycznego 8 * 4 = 32)
  137. mov eax,ds:[32] ; adres fizyczny 0*16 + 32 = 32
  138. mov cs:wektor8, eax
  139.  
  140. ; wpisanie do wektora nr 8 adresu procedury 'obsluga_zegara'
  141. mov ax, SEG obsluga_zegara ; część segmentowa adresu
  142. mov bx, OFFSET obsluga_zegara ; offset adresu
  143. cli ; zablokowanie przerwań
  144. ; zapisanie adresu procedury do wektora nr 8
  145. mov ds:[32], bx ; OFFSET
  146. mov ds:[34], ax ; cz. segmentowa
  147. sti ;odblokowanie przerwań
  148.  
  149. mov eax,ds:[36] ; adres fizyczny 0*16 + 32 = 32
  150. mov cs:wektor9, eax
  151.  
  152. ; wpisanie do wektora nr 8 adresu procedury 'obsluga_zegara'
  153. mov ax, SEG obsluga_klawiatury ; część segmentowa adresu
  154. mov bx, OFFSET obsluga_klawiatury ; offset adresu
  155. cli ; zablokowanie przerwań
  156. ; zapisanie adresu procedury do wektora nr 8
  157. mov ds:[36], bx ; OFFSET
  158. mov ds:[38], ax ; cz. segmentowa
  159. sti ;odblokowanie przerwań
  160.  
  161.  
  162. ; oczekiwanie na naciśnięcie klawisza 'x'
  163. aktywne_oczekiwanie:
  164. mov ah,1
  165. int 16H
  166. ; funkcja INT 16H (AH=1) BIOSu ustawia ZF=1 jeśli
  167. ; naciśnięto jakiś klawisz
  168. jz aktywne_oczekiwanie
  169. ; odczytanie kodu ASCII naciśniętego klawisza (INT 16H, AH=0)
  170. ; do rejestru AL
  171. mov ah, 0
  172. int 16H
  173. cmp al, 'x' ; porównanie z kodem litery 'x'
  174. jne aktywne_oczekiwanie ; skok, gdy inny znak
  175. ; deinstalacja procedury obsługi przerwania zegarowego
  176. ; odtworzenie oryginalnej zawartości wektora nr 8
  177. mov eax, cs:wektor8
  178.  
  179. cli
  180. mov ds:[32], eax ; przesłanie wartości oryginalnej
  181. ; do wektora 8 w tablicy wektorów
  182. ; przerwań
  183. sti
  184.  
  185. mov eax, cs:wektor9
  186. cli
  187. mov ds:[36], eax
  188. sti
  189.  
  190. ; zakończenie programu
  191. mov al, 0
  192. mov ah, 4CH
  193. int 21H
  194. rozkazy ENDS
  195.  
  196. nasz_stos SEGMENT stack
  197. db 128 dup (?)
  198. nasz_stos ENDS
  199. END zacznij
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement