background image

Informatyka Studia Zaoczne

Laboratorium Architektury Komputerów

Ćwiczenie 3

Struktura programu typu COM.

Podstawowe procedury systemowe MS-DOS.

Przygotowanie:
Krzysztof Tokarz

background image

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.

background image

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),

background image

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”.