AK Z Lab 4

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


Wyszukiwarka

Podobne podstrony:
AK D Lab 1
AK D Lab 5
AK D Lab 8
AK D Lab 11 (2)
AK D Lab 10
AK D Lab 3
AK Z Lab 5
AK D Lab 2
AK Z Lab 3
AK D Lab 9
AK D Lab 7
AK D Lab 6
AK Z Lab 1
AK D Lab 1

więcej podobnych podstron