Informatyka Studia Zaoczne
Laboratorium Architektury Komputerów
Ćwiczenie 3
Struktura programu typu COM.
Podstawowe procedury systemowe MS-DOS.
Przygotowanie:
Krzysztof Tokarz
1. Cel ćwiczenia.
Celem ćwiczenia jest poznanie:
- struktury programu asemblerowego,
- struktury pliku typu COM,
- funkcji obsługi standardowego wejścia i wyjścia w MS-DOS,
- przebiegu asemblacji programu COM.
2. Dyrektywy i instrukcje.
Instrukcją nazywamy słowo kluczowe, które zostanie przetłumaczone przez program asemblera na
wykonywalny kod dla procesora.
Dyrektywą nazywamy polecenie sterujące przebiegiem asemblacji – nie są one bezpośredniego
tłumaczone na kod wynikowy dla procesora.
3. Segmentacja pamięci.
Pamięć widziana przez mikroprocesory rodziny 8086 jest podzielona na segmenty o rozmiarze
64kB. Podział na segmenty pozwala na operowanie wewnątrz programu lub bloku programu na
adresach 16-bitowych co ma korzystny wpływ na szybkość działania programu i zmniejsza jego
wymagania pamięciowe. Jedynie skoki i odwołania między segmentami muszą być przechowywane
w postaci pary liczb szesnastobitowych, z których jedna oznacza początek segmentu, druga
przemieszczenie wewnątrz segmentu (SEGMENT:OFFSET). Procesor jednocześnie może
operować na 4 segmentach. Adres segmentu musi być załadowany do jednego z rejestrów
segmentowych:
–
CS – segment kodu,
–
DS – segment danych,
–
ES – dodatkowy segent danych,
–
SS – segment stosu.
Przemieszczenie (offset) może być podane w innym rejestrze, lub jako stała. Może być również
sumą zawartości dwóch rejestrów oraz stałej – mówimy w takim przypadku o adresie efektywnym.
Para segment:offset tworzy adres logiczny. Adres logiczny jest przekształcany na adres fizyczny
dostarczany do pamięci RAM w następujący sposób:
adres_fizyczny = segment * 16 + offset
Proces oblicznia adresu można również przedstawić za pomocą następującego schematu:
–
zawartość wybranego rejestru segmentowego jest przesuwana o 4 pozycje bitowe w lewo i
uzupełniana czterema zerami,
–
do przesuniętej zawartości rejestru jest dodawana wartość przemieszczenia wewnątrz segmentu
(OFFSET),
–
otrzymana 20-bitowa liczba jest adresem fizycznym doprowadzonym do pamięci.
Oznacza to że początek segmentu musi być liczbą podzielną przez 16 (czyli mieć w zapisie
szesnastkowym najmłodszą cyfrę = 0). W ten sposób mikroprocesor może zaadresować obszar 1
MB pamięci.
4. Opis struktury programu typu COM.
Programy typu COM mają bardzo prostą strukturę. Ich rozmiar nie może przekroczyć rozmiaru
pojedynczego segmentu, czyli 64kB. Zarówno kod jak i dane muszą się zmieścić w tym segmencie.
Na początku programu musi być zarezerwowane miejsce na tworzony podczas ładowania programu
do pamięci blok PSP o rozmiarze 256 bajtów. Ponieważ całość programu mieści się w jednym
segmencie to rejestry CS i DS wskazują na to samo miejsce w pamięci, a przemieszczenia (offset),
na których operuje program są 16-bitowe. Ponadto w programie typu COM nie występuje stos.
5. Tworzenie segmentów.
W języku asemblera 8086 segmenty tworzymy za pomocą dyrektyw segmentowych. Najwygodniej,
dla prostych programów użyć do tego celu uproszczonych dyrektyw deklaracji segmentu. Aby użyć
tych dyrektyw najpierw należy zdefiniować model pamięci. W zależności od wybranego modelu w
programie może być jeden lub wiele segmentów. Segmenty mogą być grupowane. Większość
modeli pamięci grupuje segmenty danych w grupie o nazwie DGROUP.
Nazwy segmentów, grup segmentów i przypisanie ich do rejestrów segmentowych dla różnych
modeli pamięci:
Model
CS
DS
ES
SS
TINY
DGROUP
DGROUP
DGROUP
DGROUP
SMALL
_TEXT
DGROUP
DGROUP
DGROUP
MEDIUM
Nazwa_TEXT
DGROUP
DGROUP
DGROUP
COMPACT
_TEXT
DGROUP
FAR_DATA
DGROUP
LARGE
Nazwa_TEXT
DGROUP
FAR_DATA
DGROUP
HUGE
Nazwa_TEXT
DGROUP
FAR_DATA
DGROUP
Dla programów typu COM jest używany model pamięci TINY. W tym modelu wszystkie segmenty
(zarówno kodu jak i danych tworzą jedną grupę DGROUP). Rozmiar tej grupy nie może
przekroczyć rozmiaru pojedynczego segmentu, czyli 64kB. Przykładowa struktura asemblerowego
programu typu COM może wyglądać następująco:
.MODEL TINY
.CODE
;... miejsce na dane i kod programu
END
Na początku programu niezbędne jest ustawienie adresu rejestru segmentowego danych DS. Można
go pobrać ze zmiennej @DATA lub bezpośrednio z nazwy grupy segmentów danych DGROUP.
Adres segmentu kodu można pobrać ze zmiennej @CODE.
6. Podstawowe funkcje systemu MS-DOS.
System MS-DOS udostępnia programiście zestaw funkcji wywoływanych za pomocą przerwania
programowego INT 21h. Najczęściej używana jest funkcja o numerze 4Ch, której wywołanie
spowoduje zakończenie programu i bezpieczny powrót do systemu operacyjnego. Numer funkcji
wpisuje się do rejestru AH, a następnie wywołuje przerwanie programowe INT 21h.
mov ah,4Ch
;numer funkcji do ah
mov al,0
;kod powrotu do al
int 21h
;wywolanie funkcji
Inne użyteczne funkcje to:
-
02h – wypisanie na ekranie znaku (DL zawiera kod ASCII znaku do wyświetlenia),
-
09h – wypisanie na ekranie tekstu (DS:DX zawiera adres początku tekstu, tekst musi być
zakończony znakiem $)
-
08h – odczytanie znaku z klawiatury (w AL jest zwracany kod ASCII naciśniętego znaku),
-
4Ch – powrót do systemu operacyjnego (AL może zawierać kod powrotu),
7. Asemblacja programu w asemblerze TASM.
Kompilacja programu - program tasm
Opcje:
/l - generowanie raportu kompilacji
/la - generowanie rozszerzonego raportu kompilacji
/zi - umieszczenie w zbiorze wynikowym informacji o numerach wierszy i symbolach modułu
źródłowego
/m# - kompilacja w # przebiegach
Łączenie (konsolidacja) - program tlink
Opcje:
/l - włączenie do programu wykonywalnego informacji o liniach programu źródłowego
/v - włączenie do programu wykonywalnego informacji uruchomieniowych
/t - tworzenie pliku *.com
8. Przykładowy program typu COM.
Drukuj
EQU
9
Wyjscie
EQU
4Ch
Kod
SEGMENT
ASSUME CS:Kod
ORG 100h
Start:
jmp Poczatek
Tekst
DB 'Przykladowy tekst', 0Dh, 0Ah, '$'
Poczatek: mov ax, cs
mov ds, ax
mov dx, OFFSET Tekst
mov ah, Drukuj
int 21h
mov ah, Wyjscie
int 21h
Kod
ENDS
END Start
9. Przebieg ćwiczenia.
Na ćwiczeniu laboratoryjnym należy:
–
Dokonać asemblacji, konsolidacji (linkowania) i uruchomienia przykładowego programu typu
COM.
–
Przeanalizować działanie programu wykorzystując program uruchomieniowy (debuger) td.exe.
–
Sprawdzić w debugerze wersje asemblowane z włączonymi opcjami wspomagania uruchamiania
(tasm.exe /zi), (tlink.exe /l, /v).
–
Napisać program wyświetlający na ekranie litery naciskane na klawiaturze i kończący działanie
po naciśnięciu “ESC”.