Programowanie w językach symbolicznych - LABORATORIUM

 

Sprawozdanie z ćwicz. Nr 4 z dn. 30.05.1998  - Asembler

Wykorzystanie procedur asemblerowych w językach wysokiego poziomu
na przykładzie procedur graficznych (VGA - tryb 13h)

 

1.   Cel ćwiczenia
1)- zapoznanie się z wykorzystaniem procedur graficznych napisanych w asemblerze, by były dostępne w języku C
2) - napisanie programu a asemblerze, wywołującego tryb graficzny a następnie procedur asemblerowych
oraz programu w C, który te procedury wykorzystuje.

 

2.   Opis podstawowych funkcji do trybu graficznego
Przerwanie 10h - funkcje BIOS
1.1 Funkcja 00h wywołuje tryb graficzny.
Parametry: wejście AH 00h,  AL. bity 0-6 - nr trybu pracy sterownika, bit 7 - zachowanie pamięci przy zmianie trybu
Wywołanie przerwania 10h po wpisaniu do AH numeru funkcji: AH=00h (mov ah,00h) a do AL. Numeru trybu (mov al.,13h).
Ekran w trybie 13h ma rozdzielczość 320x200 punktów, 256 kolorów, tryb graficzny, zgodny z MCGA.
Pamięć obrazu w tym trybie zaczyna się od segmentu 0a000h i zajmuje 64000 bajtów.
Każdemu punktowi odpowiada 1 bajt, czyli punkt może przyjąć 256 kolorów.
Punkty ułożone są kolejno w wierszach.
Np. punktowi (0,0) odpowiada przesuniecie 0, punktowi (10,0) przesunięcie 10, punktowi (0,1) przesunięcie 320 (0 kolumn, 1 wiersz).
Przesunięcie punktu (X,Y) liczy się wg wzoru:   p. = 320*Y + X
Dostęp do ekranu może być za pomocą przerwania 10h (postawienie punktu o podanych współrzędnych i kolorze -
 metoda b. powolna)  lub bezpośredni - wpisywanie wartości do pamięci ekranu  (metoda szybka)
Tryb tekstowy ma nr trybu 03h - 80x25, 16 kolorów, CGA.
1.2. Funkcja 0Fh - odczytanie trybu pracy sterownika
Wejście: AH 0Fh
wyjście: AH - liczba kolumn, AL. - tryb pracy, BH - nr strony
1.3. 0Ch - wpisanie punktu na podaną pozycję
1.4. 0Dh - odczytanie punktu z podanej pozycji

3.   Sprawozdanie z przebiegu ćwiczenia
W pierwszym kroku programowania wprowadzono linie kodu prowadzące do przejścia
w tryb graficzny 13h, a po naciśnięciu klawisza powodujące przejście w tryb tekstowy.
W drugim kroku dopisano linie programu tak, by program wyświetlał poziomą linię na całej szerokości ekranu
- na  podanej współrzędnej y (odległość od góry).
W tym celu napisano procedurę _RysujPoz umożliwiającą rysowanie linii poziomej.
Przy pisaniu programu istotne znaczenie miała tzw. ramka stosu i uwzględnienie adresów powrotu  
oraz uwzględnienie podkreślników na początku nazw podprogramów.
Program skompilowano (TASM, TLINK). Był to program o czystej postaci asemblerowej - GC.ASM, po kompilacji G.EXE.
Druga faza ćwiczenia miała na celu opracowanie na bazie programu czysto asemblerowego wersji programu asemblerowego
do wykorzystania przez kompilator języka C. Z pliku wyodrębniono odpowiednie linie kodu i uzupełniono tworząc
dodatkowe podprogramy: _TrybGraf do ustawiania trybu graficznego oraz _Czekaj do oczekiwania na naciśnięcie klawisza.
Inne zbędne linie kodu usunięto, a program w tej postaci  zapamiętano w pliku GC.ASM.
Program taki można skompilować ale nie działa samodzielnie.
Przed każdym podprogramem dopisano również słowo kluczowe PUBLIC,
w celu dostarczenia odpowiedniej informacji dla kompilatora języka wysokiego poziomu (tutaj C).
W dalszej fazie opracowano program w języku C - GCC.C, którego zadaniem
jest wywołanie procedur asemblerowych widocznych jako funkcje zewnętrzne dla języka C.
Program skompilowano poleceniem BCC  GCC.C  GC.ASM.
Rozszerzenie pliku w języku C też najlepiej jak ma C, to nie trzeba podawać w źródle
dodatkowej informacji dla kompilatora  C++,  że jest to program w języku C.
W deklaracjach funkcji asemblerowych  w C  uwzględniono słowa extern. .
Efekt działania obu programów był taki sam.