Informatyka Studia Zaoczne
Laboratorium Architektury Komputerów
Ćwiczenie 4
Struktura programu EXE.
Wykorzystanie procedur systemowych MS-DOS.
Procedury i makrodefinicje.
Przygotowanie:
Krzysztof Tokarz
1. Cel ćwiczenia.
Celem ćwiczenia jest poznanie:
- struktury programu typu EXE,
- funkcji obsługi ekranu,
- organizacji ekranu w trybie tekstowym.
2. Opis struktury programu typu EXE.
Programy typu EXE są znacznie bardziej uniwersalne niż programy typu COM. Ich rozmiar może
być dowolny, ograniczony jest on jedynie rozmiarem dostępnej w systemie pamięci operacyjnej.
Tworzony przez system podczas ładowania programu do pamięci blok PSP programu EXE jest
umieszczony w osobnym segmencie. Po uruchomieniu programu adres początku segmentu PSP jest
umieszczony (identycznie jak w programach COM) w rejestrach DS i ES. Na początku pliku z
programem EXE istnieje nagłówek, który zawiera m.in. Sygnaturę pliku EXE ( MZ ), informacje o
wielkości kodu programu, adresie startowym, rozmiarze nagłówka, rozmiarze tablicy relokacji. Na
końcu nagłówka umieszczona jest tablica relokacji. Zawiera ona adresy w postaci
SEGMENT:OFFSET zmiennych i procedur, które są w programie wywoływane jako dalekie (poza
segment). Podczas ładowania programu adresy te są modyfikowane w zależności od miejsca
umieszczenia programu w pamięci komputera.
3. Organizacja ekranu w trybie tekstowym.
Ekran w trybie tekstowym zorganizowany jest jako 25 wierszy po 80 znaków. Na każdy znak
przeznaczone są dwa bajty w pamięci, z których pierwszy zawiera kod ASCII wyświetlonego znaku,
drugi zawiera atrybuty opisujące kolor znaku, kolor tła, migotanie znaku. Początek pamięci ekranu
znajduje się pod adresem B800h. Jako pierwszy zapisany jest znak leżący w lewym górnym
narożniku ekranu. Następne bajty opisują kolejne znaki w wierszu, po 160 bajtów na wiersz.
B800h
80 kolumn
25 wierszy
Wygodnym sposobem operacji na pamięci ekranu jest wpisanie adresu B800h do rejestru
segmentowego (np. ES), a następnie operowanie na przemieszczeniu wewnątrz segmentu.
4. Funkcje karty graficznej.
Inną metodą operowania na pamięci ekranu jest wykorzystanie funkcji przerwania INT 10h. Jest to
przerwanie BIOS-u karty graficznej. Najważniejsze funkcje dotyczące obsługi ekranu w trybie
tekstowym:
- 00h ustawienie trybu pracy (AL zawiera numer trybu n.p. tryb 03h tekst 80x25, 16 kolorów),
- 0Fh odczyt trybu pracy (w AL zwraca numer trybu, w BH numer bieżącej strony, w AH liczbę
kolumn),
- 02h ustawienie pozycji kursora (DH i DL zawierają numer wiersza i kolumny pozycji kursora,
BH zawiera numer strony w pamięci ekranu),
- 03h odczytanie pozycji kursora (w DH i DL zwracane są numery wiersza i kolumny pozycji
kursora, w BH numer strony w pamięci ekranu),
- 05h ustawienie aktywnej strony (AL zawiera numer strony n.p. dla trybu 03h strony 0-3),
- 08h odczytanie znaku i atrybutu w miejscu kursora (w BH podajemy numer strony w pamięci
ekranu, w AH zwracany jest atrybut, w AL kod ASCII znaku),
- 09h zapis znaku i atrybutu w miejscu kursora (w BH podajemy numer strony w pamięci
ekranu, w BL atrybut, w AL kod ASCII znaku, w CX ilość powtórzeń operacji),
5. Przykładowy program typu EXE.
Program wyświetlający tekst na ekranie z wykorzystaniem funkcji MS-DOS z pełnymi definicjami
segmentów. Jest to odpowiednik programu z laboratorium numer 3, wykorzystuje jednak osobne
segmenty danych i kodu, posiada segment stosu.
Drukuj EQU 9
Wyjscie EQU 4Ch
Dane SEGMENT
Tekst DB 'Przykladowy tekst', 0Dh, 0Ah, '$'
Dane ENDS
Kod SEGMENT
assume CS:Kod,DS:Dane
Start: mov ax, Dane
mov ds, ax
mov dx, OFFSET Tekst
mov ah, Drukuj
int 21h
mov ah, Wyjscie
int 21h
Kod ENDS
Sts SEGMENT PARA STACK
db 512 DUP(?)
Sts ENDS
END Start
6. Procedury i makrodefinicje.
Procedura jest wydzielonym fragmentem kodu, któy może być wywoływany z innego miejsca w
programie. Wywołanie procedury następuje instrukcją CALL. Jej działanie polega na zapamiętaniu
na stosie adresu powrotu (adresu instrukcji następnej po CALL), a następnie wykonaniu skoku do
pierwszej linii procedury. Powrót z procedury następuje instrukcją RET, która automatycznie
zdejmuje ze stosu adres powrotu. Kod procedury występuje tylko raz w programie. Procedurę
definiuje się dyrektywą PROC, a kończy dyrektywą ENDP.
Makrodefinicja jest wydzielonym fragmentem kodu, który jest wstawiany do kodu wynikowego w
miejscu użycia jej nazwy. Nie ma specjalnej instrukcji służącej wywołaniu makrodefinicji. Kod
makrodefinicji występuje w programie tyle razy, ile razy jest ona użyta. Makrodefinicję definiuje się
dyrektywą MACRO, a kończy dyrektywą ENDM.
Różnicę pomiędzy procedurą a makrodefinicją najlepiej zobrazować na przykładach:
Program wyświetlający tekst na ekranie z wykorzystaniem funkcji karty graficznej z uproszczonymi
definicjami segmentów. Program wykorzystuje technikę procedur.
.MODEL SMALL
Czytaj_tryb EQU 0Fh
Wypisz_znak EQU 09h
Wyjscie EQU 4Ch
.DATA
Tekst DB 'Przykladowy tekst - procedury', 0h
.CODE
Start: mov ax, SEG DGROUP
mov ds, ax
mov si, OFFSET Tekst
call Druk
mov ah, Wyjscie
int 21h
Druk PROC
mov ah, Czytaj_tryb ; w BH zwraca numer strony
int 10h
druk_znak:
mov al, [si] ; znak do wyswietlenia
cmp al, 0 ; czy koniec tekstu
je druk_koniec
mov cx, 1 ; liczba znakow do wyswietlenia
mov bl, 0Fh ; atrybut
mov ah, Wypisz_znak ; numer funkcji
int 10h
inc si
jmp druk_znak ; nastepny znak
druk_koniec:
ret
Druk ENDP
.STACK 512
END Start
Taki sam program wykorzystujący technikę makrodefinicji
.MODEL SMALL
Czytaj_tryb EQU 0Fh
Wypisz_znak EQU 09h
Wyjscie EQU 4Ch
.DATA
Tekst DB 'Przykladowy tekst - makra', 0h
.CODE
Start: mov ax, SEG DGROUP
mov ds, ax
mov si, OFFSET Tekst
Drukuj
mov ah, Wyjscie
int 21h
Drukuj MACRO
LOCAL druk_znak, druk_koniec
mov ah, Czytaj_tryb ; w BH zwraca numer strony
int 10h
druk_znak:
mov al, [si] ; znak do wyswietlenia
cmp al, 0 ; czy koniec tekstu
je druk_koniec
mov cx, 1 ; liczba znakow do wyswietlenia
mov bl, 0Fh ; atrybut
mov ah, Wypisz_znak ; numer funkcji
int 10h
inc si
jmp druk_znak ; nastepny znak
druk_koniec:
ENDM
.STACK 512
END Start
Wyszukiwarka
Podobne podstrony:
AK D Lab 1ak 2 lab (1)AK D Lab 2AK Z Lab 5AK D Lab 6AK Z Lab 3AK D Lab 5AK Z Lab 1AK D Lab 7AK D LabAK D LabAK D Lab 8AK Z Lab 2AK Z Lab 6AK D Lab 3AK D Lab 9Lab cppwięcej podobnych podstron