A r c h i t e k t u r a K o m p u t e r ó w – L a b o r a t o r i u m
Ćwiczenie 1–1
In s t yt u t In fo r ma t yk i , P Ł
str. 1
Ć
wiczenie 1–1
Kompilacja, konsolidacja i debugowanie programów
asemblerowych
Cel:
Zapoznanie się z narzędziami TASM, TLINK, TD.
Zadanie:
W przykładowych programach typu .COM i .EXE odnaleźć błędy
syntaktyczne (składniowe) i semantyczne (logiczne), a po ich
skorygowaniu uruchomić poprawnie działające wersje.
1.
Ogólne zasady tworzenia programów asemblerowych
Istnieją przypadki takich zastosowań programistycznych, w których szczególnie ważne
jest uzyskanie optymalnego pod względem szybkości działania kodu wynikowego.
Posługujemy się wtedy zwykle językiem asemblerowym.
W przypadku bardzo prostych programów, a zwłaszcza „wstawek” przeznaczonych do
współpracy z językiem wysokiego poziomu, które mają kilka lub kilkanaście rozkazów,
można bezpośrednio stworzyć program maszynowy za pomocą monitora kodu maszynowego
lub debuggera takiego jak np. TD. Można wtedy natychmiast przetestować program i zapisać
jego ostateczną postać na dysku w postaci mapy pamięci, np. jako gotowy do wykonania plik
typu .COM. Z drugiej strony każda poprawka, prowadząca zwykle do zmiany objętości
programu jest dość pracochłonna i w skrajnym przypadku wymaga napisania od początku
kilkunastu rozkazów.
W przypadku programów dłuższych, szczególnie zaś takich, które będą w przyszłości
modyfikowane i rozbudowywane, wskazane jest użycie asemblera. Tutaj droga od programu
ź
ródłowego do działającego programu maszynowego jest dłuższa. Najpierw należy zapisać
program źródłowy w pliku dyskowym za pomocą dowolnego edytora, następnie dokonać jego
asemblacji.
Turbo Assembler został opracowany z przeznaczeniem dla komputera osobistego z
mikroprocesorami 8088, 8086, 80286, 80386 i późniejszymi, należącymi do rodziny
procesorów o architekturze intelowskiej (ang. Intel Architecture, w skrócie: IA). Kompilator
Turbo Assemblera jest programem wykonywalnym zawartym w pliku TASM.EXE.
Wywołanie go uzyskuje się za pomocą polecenia:
tasm Nazwa
gdzie
Nazwa
jest częścią główną nazwy pliku źródłowego. Powoduje to skompilowanie pliku
ź
ródłowego
Nazwa.ASM
i utworzenie w pliku
Nazwa.OBJ
przemieszczalnego modułu
pośredniego. (Opis zasad posługiwania się kompilatorem TASM znajduje się np. w: S. Kruk:
„Turbo Asembler. Idee, polecenia, rozkazy procesora Pentium” lub G. Syck: „Turbo
Assembler. Biblia użytkownika”.)
Asembler nie produkuje od razu gotowego do wykonania programu maszynowego, lecz
tzw. kod pośredni, który zawiera wprawdzie kody rozkazów, ale jest jeszcze pozbawiony
części adresów. Dopiero przetworzenie kodu pośredniego za pomocą tzw. programu
łączącego zwanego też konsolidatorem (ang. linker) daje wykonywalny kod maszynowy.
A r c h i t e k t u r a K o m p u t e r ó w – L a b o r a t o r i u m
Ćwiczenie 1–1
In s t yt u t In fo r ma t yk i , P Ł
str. 2
2.
Uruchamianie programu łączącego TLINK
W celu utworzenia programu wykonywalnego należy przeprowadzić konsolidację
(łączenie) modułów pośrednich (o rozszerzeniach .OBJ) z ewentualnymi modułami
bibliotecznymi. Zadanie to można wykonać za pomocą konsolidatora TLINK. Jest to program
wykonywalny zawarty w pliku o nazwie TLINK.EXE. Wywołujemy go poleceniem:
tlink Nazwa
gdzie
Nazwa
jest częścią główną nazwy pliku z kodem pośrednim. Wywołanie takie
powoduje połączenie (skonsolidowanie) modułu pośredniego zawartego w pliku
Nazwa.OBJ
(plik ten zawiera już kody wszystkich rozkazów maszynowych) i utworzenie programu
wykonywalnego
Nazwa.EXE
. Gdy program nie wykorzystuje modułów bibliotecznych
(przypadek wywołania TLINK w postaci jw.) to termin „połączenie” należy rozumieć nieco
odmiennie niż by to wynikało ze znaczenia tego słowa. W tym najprostszym przypadku jest to
tylko przekształcenie informacji zawartych w formacie .OBJ do formatu .EXE. W ogólnym
przypadku program TLINK (każdy program łączący) pozwala połączyć w jeden program
(.EXE) kilka oddzielnie, niezależnie przygotowanych procedur przechowywanych w plikach
pośrednich typu .OBJ. Procedury takie mogą być przygotowane przez dowolny kompilator
posiadający własność produkowania plików takiego typu. (Może to być np. asembler MASM,
kompilator Turbo C, ale nie Turbo Pascal.)
Wywołanie konsolidatora TLINK ma w ogólnym przypadku postać:
tlink opcje objs,exec,map,libraries
gdzie:
•
opcje — zestaw opcji;
•
objs — zestaw nazw plików zawierających moduły pośrednie;
•
exec — nazwa pliku, w którym zostanie umieszczony program wykonywalny;
•
map — nazwa pliku, w którym zostanie umieszczona mapa konsolidacji;
•
libraries — zestaw nazw plików zawierających biblioteki modułów wynikowych.
3.
Programy typu .EXE i programy typu .COM
W systemie MS–DOS występują dwa typy plików zawierające programy do
natychmiastowego wykonania (maszynowe): z rozszerzeniem .COM i .EXE. Program typu
.COM cechuje się maksymalnie uproszczonym sposobem ładowania, gdyż jest niczym innym
jak tylko zwyczajną mapą pamięci, nie podlegającą w trakcie ładowania żadnym
modyfikacjom i uzupełnieniom (w odróżnieniu od .EXE). Format typu .EXE jest jednak
bardziej uniwersalny i prostszy do uzyskania. W tym formacie produkuje programy
maszynowe program łączący (np. TLINK). Niestety na programie typu .EXE trzeba dokonać
podczas procesu ładowania dodatkowych zabiegów „uzdatniających”. W takim pliku przed
właściwym kodem maszynowym znajduje się specjalny nagłówek, utworzony przez program
łączący. Najważniejszym elementem nagłówka są informacje zapewniające programowi
przemieszczalność. Nagłówek znajduje się w pliku na dysku i służy jedynie do modyfikacji
przez MS-DOS niektórych bajtów programu. Do pamięci operacyjnej program jest ładowany
bez nagłówka. Program, niezależnie od objętości, może być ładowany pod dowolnym
adresem. W nagłówku zawarte są informacje o lokalizacji wszystkich rozkazów
korzystających z adresacji odległej (w szczególności skoki i wywołania procedur; w raporcie
z asemblacji miejsca takie oznaczone są literą R — skrót od relokowalny). Podczas ładowania
programu system operacyjny uwzględnia bieżące adresy absolutne poszczególnych
segmentów i wpisuje je w pola adresowe odpowiednich rozkazów. Tak więc ostateczny kod
maszynowy, głównie zaś pola operandów rozkazów korzystających z bezpośredniej adresacji
odległej, przybierają ostateczną postać dopiero podczas ładowania programu pod określony
A r c h i t e k t u r a K o m p u t e r ó w – L a b o r a t o r i u m
Ćwiczenie 1–1
In s t yt u t In fo r ma t yk i , P Ł
str. 3
adres w pamięci. W każdym segmencie programu typu .EXE pierwszy obiekt (dana, kod
instrukcji lub obszar roboczy np. stos) ma przesunięcie adresowe 0.
Załadowanie programu typu .EXE:
1.
Odczytanie pozycji 00H..1BH nagłówka, co pozwala na ustalenie długości programu —
zarezerwowanie odpowiedniej pamięci względnie wyprowadzenie komunikatu o błędzie.
2.
Na podstawie informacji zawartych w nagłówku oraz aktualnego stanu systemu następuje
określenie pierwszego segmentu pamięci, do którego można załadować program.
Dochodzi do utworzenia tam obszaru PSP (patrz niżej), a następnie, tuż za PSP,
załadowania kodu programu.
3.
Odczytanie tablicy relokacji zawartej w nagłówku i przeprowadzenie zgodnie z nią
odpowiednich modyfikacji (tabela relokacji zawiera te adresy programu, pod którymi
znajdują się odwołania segmentowe, do których trzeba dodać wartość przemieszczenia
segmentu. Podkreślmy jeszcze raz, że w pliku .EXE zawarty jest kod programu w którym
za pierwszy adres przyjęto adres 0000:0000).
4.
Załadowanie rejestrów odpowiednimi wartościami (patrz niżej).
Ponieważ na programie typu .COM podczas jego ładowania do pamięci operacyjnej nie
przeprowadza się żadnych modyfikacji, to musi być on napisany tak, aby jego pierwszy
rozkaz (lub pierwsza dana) miał przesunięcie 256 (100h). Spowodowane jest to tym, że
pierwsze 256 bajtów w segmencie, do którego będzie ładowany, zajmie obszar PSP.
(Możliwość spełnienia tego warunku gwarantuje nam istnienie dyrektywy
ORG
w języku
asemblera.) Drugim istotnym ograniczeniem na programy typu .COM jest fakt, że mogą one
wykorzystywać maksimum 64 KB pamięci tj. jeden segment. (Końcowe 256 bajtów w tym
segmencie rezerwowane jest automatycznie przez system na stos programowy!) Choć
programy typu .COM mogą zająć najwyżej 64 KB pamięci, to mają tę nieprzyjemną
własność, że blokują całą pozostałą pamięć. Kolejny program może zostać załadowany do
pamięci za swym poprzednikiem (wywołanie funkcji DOS z AH=4Bh przerwaniem INT 21h)
dopiero wtedy, gdy pamięć zostanie odpowiednio uwolniona (użycie ekstrakodu 4Ah —
wywołanie funkcji o numerze 4Ah).
Zarówno programy typu .COM, jak i .EXE korzystają ze specjalnego tzw. nagłówka
segmentu programu (ang. Program Segment Prefix, w skrócie: PSP). Nagłówek ten jest
tworzony przez system operacyjny podczas ładowania programu i zajmuje pierwsze
256 bajtów na samym początku bloku pamięci operacyjnej, do której ładowany jest program.
Zawiera on szereg pól o różnym stopniu użyteczności. Najistotniejszym jest fakt, że właśnie
w obszarze PSP system operacyjny umieszcza wszystkie parametry, które zostały podane w
linii polecenia podczas wywoływania programu, oraz pewne ważne adresy i parametry
systemowe. W programach typu .COM dostęp do obszaru PSP jest bardzo prosty, gdyż PSP
zajmuje pierwsze 256 bajtów w segmencie kodu programu. I tak np. najprostszy sposób
zakończenia programu typu .COM polega na wykonaniu rozkazu skoku bliskiego
JMP 0
(w
efekcie zostanie wykonany rozkaz
INT 20
, który zajmuje dwa pierwsze bajty PSP). W
przypadku programu typu .EXE adres segmentowy PSP jest zawarty w chwili uruchomienia
programu w rejestrze DS, więc podobna operacja nie jest możliwa. W razie potrzeby można
uzyskać adres PSP korzystając z odpowiedniej funkcji systemu operacyjnego (funkcja
nr 62h). Nadmienić tu wypada, że programy ładowane są do pamięci operacyjnej tak, że
pierwszy bajt PSP znajduje się na początku segmentu. Posiada więc on przesunięcie
(ang. offset) równe zero (jego adresem jest więc DS:0). (Szczegółowy opis budowy obszaru
PSP można znaleźć np. w: S. Kruk: „Kurs programowania w języku asembler dla średnio
zaawansowanych” lub L. Bułhak, R. Goczyński, M. Tuszyński: „DOS 5.00 od środka”.)
Uwaga! Na dysku w tym samym katalogu mogą znajdować się programy zarówno
.EXE jak i .COM o tej samej nazwie. Należy pamiętać, że przy podaniu nazwy takiego
programu jako zlecenia, zawsze zostanie uruchomiony program typu .COM.
A r c h i t e k t u r a K o m p u t e r ó w – L a b o r a t o r i u m
Ćwiczenie 1–1
In s t yt u t In fo r ma t yk i , P Ł
str. 4
4.
Posługiwanie się TASM. Rodzaje plików
W ogólnym przypadku asembler oczekuje pliku źródłowego (rozszerzenie standardowe
.ASM), zaś wynikiem jego działania są trzy inne pliki: plik z kodem pośrednim (rozszerzenie
.OBJ), plik listingu z raportem asemblacji (rozszerzenie .LST), plik tablicy wzajemnych
odwołań (rozszerzenie .CRF). Najważniejszy jest plik .OBJ, gdyż właśnie on zawiera kod, z
którego po połączeniu przez program łączący (np. TLINK) powstanie właściwy,
wykonywalny kod maszynowy. Pozostałe dwa pliki mogą być natomiast potrzebne do celów
dokumentacyjnych, a zwłaszcza do uruchamiania i testowania programu. Istnieją dwa
sposoby przeprowadzania asemblacji: przez podanie asemblerowi wszystkich plików i
parametrów w pojedynczej linii oraz przez podanie ich w trybie konwersacyjnym. Oto
schemat ogólny metody pierwszej:
tasm plik_ASM,plik_OBJ,plik_LST,plik_CRF /przelaczniki
W wypadku umieszczenia w miejscu któregokolwiek z plików (o odpowiednim
rozszerzeniu) napisu NUL plik ten nie będzie generowany (tj. generowany będzie plik pusty).
Po poprawnie wykonanej asemblacji pojawi się komunikat o ilości ostrzeżeń (ang. warning
errors) — zwykle nie należy ich ignorować, i poważnych błędów (ang. severe errors). Jeśli
kod źródłowy zostanie przygotowany bezbłędnie to pojawi się komunikat:
Warning
Severe
Errors
Errors
0
0
i możemy przystąpić do łączenia przygotowanego modułu pośredniego. Drugi sposób polega
na podaniu jedynie zlecenia
tasm
bez parametrów i wtedy nadawanie nazw plikom z
odpowiednimi rozszerzeniami będzie się odbywało w sposób konwersacyjny. Efekt
asemblacji jest identyczny z podanym wyżej.
5.
Wartości początkowe rejestrów
P
LIKI TYPU
EXE
Bezpośrednio po podjęciu wykonywania programu wywołanego przez interpreter poleceń,
wartości początkowe rejestrów ogólnego przeznaczenia są nieokreślone. Wyjątek dotyczy
jedynie rejestru SP, w którym umieszczana jest liczba bajtów stosu zarezerwowanego
przez program. Zawartości rejestru licznika rozkazów i rejestrów segmentowych są
określone jednoznacznie. Jeżeli program napisany w asemblerze zawiera dyrektywę
END
,
w której wystąpiła etykieta rozkazu (np.
Start
), to rejestr CS jest ładowany numerem
segmentu, w którym znajduje się ten rozkaz (
SEG Start
). Rejestr IP jest ładowany
przemieszczeniem w segmencie rozważanego rozkazu (
OFFSET Start
). Stanowi to
gwarancję rozpoczęcia wykonywania programu od rozkazu opatrzonego podaną etykietą.
W rejestrach DS i ES będzie znajdować się numer segmentu obszaru PSP umieszczanego
w pamięci operacyjnej tuż przed pierwszym bajtem programu, a w rejestrze SS będzie
znajdował się numer segmentu przeznaczonego na stos.
Uwaga! Jeżeli w programie występuje dyrektywa END bez etykiety, to początkowe
wartości rejestrów są następujące:
DS = ES = SEG PSP
CS = DS + 10h
IP = 0
W takiej sytuacji poprawne wykonanie programu nie jest na ogół możliwe.
P
LIKI TYPU
.COM
System operacyjny po załadowaniu programu nadaje wszystkim rejestrom segmentowym
(CS, DS, ES, SS) tę samą wartość wskazującą na początek PSP, wskaźnikowi rozkazów IP
A r c h i t e k t u r a K o m p u t e r ó w – L a b o r a t o r i u m
Ćwiczenie 1–1
In s t yt u t In fo r ma t yk i , P Ł
str. 5
wartość 100h, wskaźnikowi stosu SP wartość 0FFFCh (w komórkach 0FFFEh i 0FFFFh
automatycznie umieszczane jest słowo o wartości 0000).
6.
Zasady zakańczania programu
Po wykonaniu zadania przez program, który nie jest już dłużej potrzebny, należy
zwolnić zajmowaną przez niego pamięć i przekazać sterowanie z powrotem do systemu
operacyjnego. Można to zrealizować różnymi metodami, np. umieszczając w końcowym
fragmencie programu jedną z sekwencji rozkazów:
1.
INT 20h
2.
MOV AH, 00h
INT 21h
3.
MOV AH, 4Ch
MOV AL, ExitCode
INT 21h
Kod powrotu
ExitCode
służy do zasygnalizowania procesowi macierzystemu, jaki jest
rezultat pracy programu. Gdy program wykonał się pomyślnie, wówczas wartość
ExitCode
ustala się na 0, w przypadku zaś działania niepomyślnego podaje się wartość różną od 0
(przez proces macierzysty rozumiemy program powodujący uruchomienie danego programu
— najczęściej jest to interpreter poleceń COMMAND.COM).
Odmianą pierwszej metody jest zakończenie programu w sposób następujący:
4.
długi skok pod adres początkowy PSP (znajduje się tam kod instrukcji
INT 20h
).
Odmianą metody drugiej i trzeciej jest zakończenie:
5.
nadanie odpowiedniej wartości rejestrowi AH i długi skok pod adres przesunięty
względem początku PSP o 50h (znajdują się tam kody rozkazów
INT 21h
i
RETF
).
Najdogodniejsza jest metoda trzecia, gdyż nie wymaga spełnienia żadnych
dodatkowych warunków. Funkcję 4Ch można zlecić z dowolnego segmentu kodu. (Funkcja
4Ch występuje już w wersji MS-DOS 2.0.) Czwarty sposób wprowadzono prawdopodobnie
dla zmniejszenia skutków ewentualnych błędów — jeśli skonsolidowany program zawiera nie
przypisane fizycznie odwołania zewnętrzne (błędna konsolidacja), to w ich miejsce
wstawiane jest 0. Skok pod taki adres spowoduje więc zakończenie programu. Piąta metoda
przewidziana została z myślą o przyszłych wersjach systemu operacyjnego, w których usługi
systemowe będzie się realizowało nie za pomocą przerwań programowych, lecz poprzez
wywołania procedur systemowych.
Jeszcze inaczej można dokonywać zakończenia programu typu .COM. Pamiętamy, że
po załadowaniu takiego programu na szczycie stosu umieszczony jest adres powrotny 0000h.
Po napotkaniu rozkazu RET nastąpi więc skok pod adres 0000h znajdujący się w obszarze
PSP i zostanie wykonane przerwanie INT 20h kończące program. Stanie się tak jednak tylko
wtedy, gdy wskaźnik stosu bezpośrednio przed wykonaniem rozkazu RET będzie miał tę
samą wartość co przy wejściu do programu, a wartości w rejestrach CS i SS nie zostały
zmienione. (Podobne kłopoty można mieć, gdy zmieniona zostanie przypadkowo lub celowo
zawartość bajtów o przemieszczeniu 0Ah...0Dh w obszarze PSP.)
Uwaga! Kończąc wykonywanie programu rozkazem
INT 20h
należy mieć na uwadze,
ż
e przerwanie to nie powoduje automatycznego zamknięcia otwartych w tym momencie
plików dyskowych. Jest to niebezpieczne zwłaszcza dla plików, które były przez program
tworzone lub modyfikowane. W przypadku pliku nowo utworzonego nie zostanie on bowiem
zarejestrowany na stałe w katalogu dyskowym, co spowoduje utratę wszystkich zapisanych w
nim danych, lub zostanie zapisany tylko częściowo. Nie zamknięcie pliku modyfikowanego
może spowodować, że nie wszystkie wysłane do pliku dane zostaną rzeczywiście zapisane na
dysk (ostatnie pozostaną w buforze dyskowym w pamięci operacyjnej), zaś w katalogu może
nie zostać uwzględniony nowy rozmiar pliku. Aby zabezpieczyć się przed taką
A r c h i t e k t u r a K o m p u t e r ó w – L a b o r a t o r i u m
Ćwiczenie 1–1
In s t yt u t In fo r ma t yk i , P Ł
str. 6
ewentualnością (nie zawsze jest to konieczne) polecane jest, aby przed przekazaniem
sterowania do DOS-a zamknąć otwarte pliki poprzez przerwanie 21h o odpowiednim numerze
funkcji.
Kilka słów jeszcze o metodzie drugiej. Metoda ta jest równoważna operacji zlecanej za
pomocą przerwania numer 20h. Adres CS:0 musi wskazywać na początek PSP. Zakończenie
programu obejmuje zamknięcie wszystkich otwartych plików, zwolnienie pamięci
przydzielonej procesowi w chwili jego tworzenia i przekazanie sterowania do procesu
macierzystego.
Wniosek! Aby uniknąć problemów, należy stosować metodę trzecią.
7.
Transformacja pliku z formatu .EXE na .COM
Program łączący TLINK zazwyczaj dostarcza programów w formacie wykonywalnym
.EXE. Praktycznie wszystkie programy o niezbyt wielkiej objętości mogą być jednak zapisane
na dysku w prostym formacie .COM, będącym zwykłą mapą pamięci (o ile spełniają
wymagania stawiane temu formatowi!). Niekiedy format .COM jest wręcz wymagany, jak np.
w przypadku programów przeznaczonych do instalowania na stałe w pamięci operacyjnej w
starszych wersjach DOS-a. Program usługowy EXE2BIN służy do zamiany plików .EXE na
pliki o formacie .COM.
Przykłady wywołania:
1.
exe2bin Nazwa
rename Nazwa.bin Nazwa.com
2.
exe2bin Nazwa Nazwa.com
W przykładach uzyskaliśmy z pliku
Nazwa.EXE
plik
Nazwa.COM
.
Inną możliwością uzyskania pliku wykonywalnego w formacie .COM jest podanie przy
wywołaniu TLINK-a przełącznika /t, w sposób poniższy:
tlink /t Nazwa
W rezultacie otrzyma się od razu plik
Nazwa.COM
.
8.
Uruchamiacz — debugger
Pakiet Turbo oferuje program uruchomieniowy umożliwiający m.in.:
•
ś
ledzenie programu wynikowego na poziomie źródłowym,
•
wykonywanie programu instrukcja po instrukcji, procedura po procedurze, albo aż do
zatrzymania,
•
zastawianie pułapek, czyli kontrolnych punktów zatrzymania programu,
•
ujawnianie wartości danych przypisywanych zmiennym,
•
ujawnianie asemblerowych rozwinięć instrukcji języka wyższego poziomu,
•
ś
ledzenie przypisań danych i wywołań procedur,
•
rekonfigurację rozkładu okienek uruchomieniowych.
Wywołanie uruchamiacza odbywa się w trybie wsadowym i ma postać:
TD opcje Nazwa argumenty
gdzie
Nazwa
oznacza nazwę programu wykonywalnego typu .COM lub .EXE. (Opis budowy,
możliwości i metod posługiwania się programem TD znajduje się np. w: G. Syck: „Turbo
Assembler. Biblia użytkownika”.)
9.
Śledzenie asemblerowych rozwinięć instrukcji języków wyższego poziomu
Jak wiadomo debuggery pozwalają na śledzenie wykonywania programu instrukcja po
instrukcji. Niektóre z nich pozwalają dodatkowo śledzić na poziomie asemblera programy
napisane w języku wyższego poziomu. Takim właśnie debuggerem jest TD. Śledząc program
A r c h i t e k t u r a K o m p u t e r ó w – L a b o r a t o r i u m
Ćwiczenie 1–1
In s t yt u t In fo r ma t yk i , P Ł
str. 7
napisany w języku wyższego poziomu (np. Pascalu) obserwujemy efekt wykonania instrukcji,
na który składa się wiele rozkazów języka asemblera.
Co zrobić aby mieć możliwość przeprowadzenia takiego śledzenia? Oto ciąg działań
który nam to umożliwi:
T
URBO
P
ASCAL
W środowisku zintegrowanym dokonujemy kompilacji z następującymi opcjami:
•
Options / Compiler / Debug Information ON
•
Options / Compiler / Local Symbols ON
•
Options / Linker / Map file Detailed
•
Compile / Compile
W wyniku otrzymaliśmy program formatu .EXE. Uruchamiamy teraz TD, ładujemy nasz
plik i uruchamiamy. Używamy dalej opcji:
•
View / Module
•
View / CPU
Wciskając teraz Alt-0 otrzymujemy możliwość przełączania między oknami Module,
Messager, CPU (dla rozwiązania naszego problemu okna 1 i 3).
T
URBO
C
W środowisku zintegrowanym dokonujemy kompilacji z następującymi opcjami:
•
Debug / Source debugging ON
•
Options / Compiler / Code generation / Line numbers ON
•
Options / Linker / Map file Detailed
•
Compile / Compile
•
Compile / Link
W wyniku otrzymaliśmy program formatu .EXE. Uruchamiamy teraz TD, ładujemy nasz
plik i uruchamiamy. Używamy dalej opcji:
•
View / Module
•
View / CPU
Wciskając teraz Alt-0 otrzymujemy możliwość przełączania między oknami Module,
Messager, CPU (dla rozwiązania naszego problemu okna 1 i 3). Powiązanie instrukcji
języka C z kodem maszynowym uzyskujemy po zainicjowaniu działania programu z okna
View / Module.
10.
Pytania kontrolne
1.
Co to znaczy, że kod jest przemieszczalny (relokowalny)?
2.
Co znajduje się w pliku typu .OBJ?
3.
Jaka jest postać pliku typu .EXE ?
4.
Jaka jest postać pliku typu .COM?
5.
Kiedy możliwa jest transformacja pliku .EXE na .COM?
6.
Co zawiera plik typu .LST?
7.
Co zawiera plik typu .CRF?
8.
Do czego służy dyrektywa asemblera ORG?
9.
Na czym polega proces łączenia modułów?
10.
Wymień sposoby zakańczania programu ze wskazaniem ich wad i zalet.
11.
Jak odnaleźć adres PSP w różnych fazach działania programu?
12.
Co to jest PSP?
13.
Podaj przykłady wykorzystania informacji przechowywanej w obszarze PSP.
11.
Literatura
Budowa procesora:
A. KOWALCZYK: Assembler. Wydawnictwo Croma, Wrocław, 2001, str.27–30.
A r c h i t e k t u r a K o m p u t e r ó w – L a b o r a t o r i u m
Ćwiczenie 1–1
In s t yt u t In fo r ma t yk i , P Ł
str. 8
M. SCHMIT: Procesory Pentium. Narzędzia optymalizacji. Zakład Nauczania Informatyki MIKOM, Warszawa,
1997, str.42–44, 47–52.
S. KRUK: Procesor Pentium. Wydawnictwo PLJ, Warszawa, 1998, str.35–39.
G. SYCK: Turbo Assembler. Biblia użytkownika. Oficyna Wydawnicza LT&P, Warszawa, 2002, str.5–6.
A. DUDEK: Jak pisać wirusy. Oficyna Wydawnicza READ ME, Warszawa, 1994, str.4–6.
Segmentacja pamięci i adresowanie:
A. KOWALCZYK: Assembler. Wydawnictwo Croma, Wrocław, 2001, str.31–32, 35–37, 44–49.
G. SYCK: Turbo Assembler. Biblia użytkownika. Oficyna Wydawnicza LT&P, Warszawa, 2002, str.4–5, 32–33,
38–41, 56–58, 289–292, 296–300.
S. KRUK: Kurs programowania w języku asembler dla średnio zaawansowanych. Wydawnictwo MIKOM,
Warszawa, 2001, str.119–121, 131–134.
M. SCHMIT: Procesory Pentium. Narzędzia optymalizacji. Zakład Nauczania Informatyki MIKOM, Warszawa,
1997, str.44–45.
S. KRUK: Procesor Pentium. Wydawnictwo PLJ, Warszawa, 1998, str.45–49.
S. KRUK: Turbo Asembler. Idee, polecenia, rozkazy procesora Pentium. Wydawnictwo MIKOM, Warszawa,
2000, str.53–55.
Modele pamięci:
A. KOWALCZYK: Assembler. Wydawnictwo Croma, Wrocław, 2001, str.35.
S. KRUK: Kurs programowania w języku asembler dla średnio zaawansowanych. Wydawnictwo MIKOM,
Warszawa, 2001, str.9–10.
M. SCHMIT: Procesory Pentium. Narzędzia optymalizacji. Zakład Nauczania Informatyki MIKOM, Warszawa,
1997, str.92–93.
A. DUDEK: Jak pisać wirusy. Oficyna Wydawnicza READ ME, Warszawa, 1994, str.7–8.
G. SYCK: Turbo Assembler. Biblia użytkownika. Oficyna Wydawnicza LT&P, Warszawa, 2002, str.298.
Stałe:
G. SYCK: Turbo Assembler. Biblia użytkownika. Oficyna Wydawnicza LT&P, Warszawa, 2002, str.33–34, 317.
Zmienne:
A. KOWALCZYK: Assembler. Wydawnictwo Croma, Wrocław, 2001, str.41–44.
G. SYCK: Turbo Assembler. Biblia użytkownika. Oficyna Wydawnicza LT&P, Warszawa, 2002, str.315–316.
A. DUDEK: Jak pisać wirusy. Oficyna Wydawnicza READ ME, Warszawa, 1994, str.8–9.
Programy typu .COM i .EXE
S. KRUK: Kurs programowania w języku asembler dla średnio zaawansowanych. Wydawnictwo MIKOM,
Warszawa, 2001, str.7, 10–17, 71–73, 157–158.
L. BUŁHAK, R. GOCZYŃSKI, M. TUSZYŃSKI: DOS 5.00 od środka. Komputerowa Oficyna Wydawnicza
HELP, Warszawa, 1992, str.201–207,443–445.
A. KOWALCZYK: Assembler. Wydawnictwo Croma, Wrocław, 2001, str.38–40.
Asemblacja i konsolidacja:
S. KRUK: Turbo Asembler. Idee, polecenia, rozkazy procesora Pentium. Wydawnictwo MIKOM, Warszawa,
2000, str.37–52.
G. SYCK: Turbo Assembler. Biblia użytkownika. Oficyna Wydawnicza LT&P, Warszawa, 2002,str.20–29.
M. SCHMIT: Procesory Pentium. Narzędzia optymalizacji. Zakład Nauczania Informatyki MIKOM, Warszawa,
1997, str.94–98.
S. KRUK: Kurs programowania w języku asembler dla średnio zaawansowanych. Wydawnictwo MIKOM,
Warszawa, 2001, str.1–2.
A r c h i t e k t u r a K o m p u t e r ó w – L a b o r a t o r i u m
Ćwiczenie 1–1
In s t yt u t In fo r ma t yk i , P Ł
str. 9
Rozkazy procesora:
G. SYCK: Turbo Assembler. Biblia użytkownika. Oficyna Wydawnicza LT&P, Warszawa, 2002.
S. KRUK: Turbo Asembler. Idee, polecenia, rozkazy procesora Pentium. Wydawnictwo MIKOM, Warszawa,
2000.
S. KRUK: Procesor Pentium. Wydawnictwo PLJ, Warszawa, 1998.
A. DUDEK: Jak pisać wirusy. Oficyna Wydawnicza READ ME, Warszawa, 1994.
A. KOWALCZYK: Assembler. Wydawnictwo Croma, Wrocław, 2001.