background image

 

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

background image

 

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 

background image

 

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. 

background image

 

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 

 

 

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 

background image

 

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ą 

background image

 

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 

background image

 

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. 

background image

 

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. 

background image

 

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.