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.