background image

Informatyka Studia Zaoczne

Laboratorium Architektury Komputerów

Ćwiczenie 4

Struktura programu EXE.

Wykorzystanie procedur systemowych MS-DOS.

Procedury i makrodefinicje.

Przygotowanie:
Krzysztof Tokarz

background image

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.

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.

80 kolumn

25 wierszy

B800h

background image

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

background image

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

background image

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