Professional Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG
Asembler.
Sztuka programowania
Autor: Randall Hyde
Tumaczenie: Przemysaw Szeremiota
ISBN: 83-7361-602-0
Tytu oryginau: The Art of Assembly Language
Format: B5, stron: 968
TWJ KOSZYK
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK
CZYTELNIA
FRAGMENTY KSIEK ONLINE
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
Spis treci
Rozdzia 1. Wstp do jzyka asemblerowego...................................................... 13
1.1. Wprowadzenie........................................................................................................ 13
1.2. Anatomia programu HLA....................................................................................... 13
1.3. Uruchamianie pierwszego programu HLA ............................................................. 16
1.4. Podstawowe deklaracje danych programu HLA..................................................... 17
1.5. Wartoci logiczne ................................................................................................... 19
1.6. Wartoci znakowe................................................................................................... 20
1.7. Rodzina procesorw 80x86 firmy Intel .................................................................. 21
1.7.1. Podsystem obsugi pamici........................................................................... 24
1.8. Podstawowe instrukcje maszynowe........................................................................ 26
1.9. Podstawowe struktury sterujce wykonaniem programu HLA............................... 30
1.9.1. Wyraenia logiczne w instrukcjach HLA ..................................................... 31
1.9.2. Instrukcje if..then..elseif..else..endif jzyka HLA ......................................... 33
1.9.3. Iloczyn, suma i negacja w wyraeniach logicznych...................................... 35
1.9.4. Instrukcja while ............................................................................................ 37
1.9.5. Instrukcja for................................................................................................. 38
1.9.6. Instrukcja repeat............................................................................................ 39
1.9.7. Instrukcje break oraz breakif......................................................................... 40
1.9.8. Instrukcja forever.......................................................................................... 40
1.9.9. Instrukcje try, exception oraz endtry............................................................. 41
1.10. Biblioteka standardowa jzyka HLA wprowadzenie ......................................... 44
1.10.1. Stae predefiniowane w module stdio ........................................................... 46
1.10.2. Standardowe wejcie i wyjcie programu ..................................................... 46
1.10.3. Procedura stdout.newln................................................................................. 47
1.10.4. Procedury stdout.putiN ................................................................................. 47
1.10.5. Procedury stdout.putiNSize .......................................................................... 48
1.10.6. Procedura stdout.put ..................................................................................... 49
1.10.7. Procedura stdin.getc...................................................................................... 51
1.10.8. Procedury stdin.getiN ................................................................................... 52
1.10.9. Procedury stdin.readLn i stdin.flushInput..................................................... 53
1.10.10. Procedura stdin.get ....................................................................................... 54
1.11. Jeszcze o ochronie wykonania kodu w bloku try..endtry........................................ 55
1.11.1. Zagniedone bloki try..endtry ..................................................................... 56
1.11.2. Klauzula unprotected bloku try..endtry......................................................... 58
1.11.3. Klauzula anyexception bloku try..endtry ...................................................... 61
1.11.4. Instrukcja try..endtry i rejestry...................................................................... 61
1.12. Jzyk asemblerowy a jzyk HLA ........................................................................... 63
1.13. rda informacji dodatkowych.............................................................................. 64
Spis treci
5
3.9.4. Stos jako kolejka LIFO ............................................................................... 159
3.9.5. Pozostae wersje instrukcji obsugi stosu.................................................... 161
3.9.6. Usuwanie danych ze stosu bez ich zdejmowania ........................................ 163
3.9.7. Odwoywanie si do danych na stosie bez ich zdejmowania ...................... 165
3.10. Dynamiczny przydzia pamici obszar pamici sterty ..................................... 166
3.11. Instrukcje inc oraz dec.......................................................................................... 171
3.12. Pobieranie adresu obiektu..................................................................................... 171
3.13. rda informacji dodatkowych............................................................................ 172
Spis treci
Spis treci
9
9.4.3. Instrukcje maszynowe aaa, aas, aam i aad .................................................. 610
9.4.4. Koprocesor a arytmetyka spakowanych liczb dziesitnych ........................ 612
9.5. Obliczenia w tabelach........................................................................................... 615
9.5.1. Wyszukiwanie w tabeli wartoci funkcji .................................................... 615
9.5.2. Dopasowywanie dziedziny ......................................................................... 620
9.5.3. Generowanie tabel wartoci funkcji............................................................ 621
9.5.4. Wydajno odwoa do tabel przegldowych ............................................. 625
9.6. rda informacji dodatkowych............................................................................ 625
10
Spis treci
11
14.14. Informacja o typie czasu wykonania (RTTI) ........................................................ 822
14.15. Wywoania metod klasy bazowej ......................................................................... 824
14.16. rda informacji dodatkowych ........................................................................... 825
31
Symbol
Znacznik
Znaczenie
Przeniesienie
Brak przeniesienia
Zero
Brak zera
Przepenienie
Brak przepenienia
Znak
Brak znaku
Istnieje jeszcze kilka postaci dodatkowych; zostan one omwione w dalszych podrozdziaach
i rozdziaach.
32
Operator relacji
Operand prawy
albo
albo
Nie mona okreli obu operandw jako operandw pamiciowych. Lewy operand mona wic utosami z operandem rdowym, a operand prawy z operandem docelowym
i stosowa kombinacje rodzajw operandw takie jak dla instrukcji czy .
Kolejna analogia operatorw relacji do instrukcji i objawia si w wymogu
identycznego rozmiaru operandw. I tak, oba operandy musz by albo bajtami, albo
sowami, albo podwjnymi sowami. Jeli operand prawy jest sta, jego warto musi
nadawa si do zapisania w operandzie lewym.
I jeszcze jedno: jeli lewy operand jest rejestrem, a prawy to staa dodatnia albo inny
rejestr, porwnanie odbywa si bez uwzgldnienia znaku operandw. Efekty takiego
porwnania omwione zostan w nastpnym rozdziale; na razie wystarczy zapamita,
e nie powinno si porwnywa wartoci ujemnej przechowywanej w rejestrze z wartoci sta albo zawartoci innego rejestru. Wynik porwnania moe bowiem odbiega
od oczekiwa programisty.
33
Operatory i pozwalaj na wykonanie testu zawierania si wartoci przechowywanej w rejestrze w okrelonym zbiorze liczb. Na przykad wyraenie
daje warto logiczn , jeli warto przechowywana w rejestrze
EAX to warto z zakresu od 2000 do 2099 (wcznie). Operator ma dziaanie
odwrotne da warto logiczn jedynie wtedy, kiedy zawarto rejestru to
liczba spoza okrelonego zbioru. Na przykad wyraenie bdzie
miao warto tylko wtedy, kiedy znak przechowywany w rejestrze AL nie bdzie
ma liter alfabetu.
Oto kilka przykadw wyrae logicznych w jzyku HLA:
!""
#$$$
$
34
Jeli wyraenie logiczne przyjmie warto , wykonany zostanie kod zawarty midzy
sowami
a . W przypadku wartoci
sterowanie przekazane zostanie do
kodu ograniczonego klauzul i sowem
.
Przez osadzanie opcjonalnych klauzul
w instrukcji
mona rozbudowywa
podejmowanie decyzji o wykonaniu kodu. Na przykad, jeli rejestr CH zawiera warto
znakow, mona na podstawie jego wartoci dokona wyboru spord dostpnych
opcji menu, konstruujc nastpujc instrukcj
:
%& #$$'#
()*)&+67,*
7 8 9 )-$$+2'3
%& #$,$'#
()*)&+67,*
7 8 9 )-$,$+2'3
%& #$ $'
()*)&+67,*
7 8 9 )-$ $+2'3
()*)&+(-.7,* 8*
9 )+2'3
(%3
35
Cho nie wida tego w powyszym przykadzie, jzyk HLA nie wymaga umieszczania
po sekwencji klauzul
klauzuli . Jednak przy podejmowaniu decyzji o wykonaniu jednej z wielu cieek kodu warto uzupeni instrukcj
klauzul rozpoczynajc ciek kodu obsugi ewentualnych bdw wyboru. Nawet jeli pozornie
wykonanie owego kodu wydaje si niemoliwe, to naley wzi pod uwag ewentualny
rozwj aplikacji w kolejnych wersjach kodu wybr cieki wykonania moe mie
inny przebieg; warto, aby wtedy kod decyzyjny uzupeniony zosta o obsug sytuacji
wyjtkowych i niespodziewanych.
Obie instrukcje zostan wykonane jedynie wtedy, kiedy rwnoczenie rejestr EAX
bdzie mia warto wiksz od 0, a rejestr CH bdzie zawiera znak a. Jeli ktrykolwiek z tych warunkw nie bdzie speniony, obie instrukcje zostan pominite.
Warto pamita, e operandy operatora mog by dowolnymi poprawnymi wyraeniami logicznymi jzyka HLA nie musz to by wycznie operatory relacji. Oto
kilka poprawnych logicznych z operatorem iloczynu logicznego:
::"
$$$
$:: ,!
,;:: !
36
Jeli rejestr EAX bdzie mia warto mniejsz od zera, reszta wyraenia nie bdzie
sprawdzana cao wyraenia otrzyma warto . Jeli jednak rejestr EAX bdzie
37
zawiera warto wiksz od zera, to aby cao wyraenia otrzymaa warto ,
oba operandy operatora iloczynu musiayby mie warto .
Podwyraenia wykorzystujce operatory iloczynu i sumy logicznej mona grupowa
wedle wasnego uznania, otaczajc je nawiasami. Oto przykadowe wyraenie:
& !
"<< ,!
!':: !
Aby to wyraenie otrzymao warto logiczn prawda, rejestr ECX musi zawiera
warto zero oraz albo warto EAX musi by mniejsza od zera, albo rejestr EBX musi
zawiera warto rn od rejestru EAX. Szacowanie wyraenia przebiega wic odmiennie ni w wersji bez nawiasw.
Operator negacji logicznej ma w jzyku HLA posta znaku wykrzyknika ( ). Operandami operatora negacji mog by jednak wycznie rejestry i zmienne w pamici (np.
) operator negacji nie moe by bezporednio aplikowany do zoonych
wyrae logicznych. Aby wykona logiczn negacj wyraenia logicznego, naley to
wyraenie uj w nawiasy i cay nawias opatrzy przedrostkiem w postaci wykrzyknika:
& !
"'
Powysze wyraenie otrzymuje warto wtedy, kiedy rejestr EAX ma warto
mniejsz od zera.
Operator logicznej negacji jest szczeglnie uyteczny w odniesieniu do wyrae zoonych angaujcych operatory logicznej sumy i logicznego iloczynu. W prostych wyraeniach, jak powysze, lepiej jest zazwyczaj bezporednio okreli stan logiczny wyraenia ni dodatkowo komplikowa go operatorem negacji.
W jzyku HLA programista moe te korzysta z operatorw bitowych " i , ale te rni
si znaczco od operatorw logicznych "" oraz . Szczegowe omwienie operatorw
bitowych i innych operatorw jzyka HLA znajduje si w dokumentacji kompilatora.
38
Instrukcja ptli
odpowiada nastpujcej ptli
:
3
.# &'(
3
(.# 3
Wyraenie inicjalizujce moe by dowoln, pojedyncz instrukcj maszynow. Instrukcja ta zwykle inicjalizuje rejestr albo zmienn przechowywan w pamici, ktrej warto
decyduje o kontynuowaniu ptli (tzw. licznik ptli). Warunek to wyraenie logiczne
jzyka HLA w formacie takim jak dla instrukcji
. Warto tego wyraenia decyduje o podjciu kolejnej iteracji ptli i zwykle angauje licznik ptli. Instrukcja licznika to typowo instrukcja zwikszajca licznik ptli; odpowiednikiem tej instrukcji
jest instrukcja w ptli
, ktrej wykonanie zmienia warto logiczn warunku
wykonania ptli. Zwykle instrukcj t jest instrukcja jzyka HLA, na przykad .
39
Test warunku zatrzymania ptli odbywa si po zakoczeniu wykonywania ciaa ptli. Z tego wzgldu instrukcja (bd blok instrukcji) ciaa ptli zostanie
wykonana przynajmniej raz, niezalenie od wartoci pocztkowej wyraenia warunku
zatrzymania ptli. Warunek ten jest badany po raz pierwszy dopiero po zakoczeniu
pierwszej iteracji; jeli wyraenie ma warto
, ptla jest powtarzana2. Jeli warunek otrzyma warto , ptla jest zatrzymywana i sterowanie przekazywane jest
do instrukcji znajdujcych si za klauzul .
Oto prosty przykad wykorzystania ptli :
9&"2 !'3
*
()*)&+ !+2 !2'3
),&2 !'3
)& !"'3
2
Znaczenie warunku jest wic w jzyku HLA odwrotne ni warunku w analogicznej konstrukcji
(.# znanej z jzykw C, C++ i Java.
40
Jeli instrukcje ciaa ptli maj by wykonane przynajmniej raz, niezalenie od wartoci wyraenia warunku ptli, wtedy w miejsce ptli
lepiej zastosowa ptl #
konstrukcja taka bdzie efektywniejsza.
Instrukcja
tworzy ptl nieskoczon. Wewntrz takiej ptli mona jednak
umieci instrukcje $ bd $
celem przerwania ptli w wybranym momencie.
To chyba najczstszy ukad ptli
. Ilustruje go nastpujcy przykad:
%
()*)&+6*.(
, 4.&9 8
("'-+'3
(= &'3
, 4%&
"'3
()*)&+6*.(
. 9,7 9 8
("+2'3
(%3
41
Blok instrukcji && suy do ochrony wykonania instrukcji. Jeli wykonanie
instrukcji znajdujcych si pomidzy klauzul & a pierwsz klauzul ! ,
tworzcych tzw. blok chroniony, przebiegnie bez niespodzianek, sterowanie przekazywane jest do pierwszej instrukcji za klauzul &. Jeli jednak w czasie wykonywania instrukcji bloku chronionego zdarzy si bd (wyjtek), wykonanie programu
jest przerywane, a sterowanie przekazywane jest do odpowiedniej klauzuli !
(skojarzonej z wyjtkiem, ktry wystpi). Kady wyjtek ma unikalny identyfikator
w postaci liczby cakowitej. Niektre z identyfikatorw wyjtkw zadeklarowane zostay
w pliku nagwkowym excepts.hhf biblioteki standardowej jzyka HLA, ale programista moe te definiowa wasne wyjtki. W momencie sprowokowania wyjtku system
porwnuje identyfikator zgoszonego wyjtku z identyfikatorami okrelonymi w klauzulach ! . Jeli wrd nich znajduje odpowiedni identyfikator, nastpuje wykonanie
instrukcji okrelonych w ramach klauzuli ! . Po zakoczeniu wykonywania tych
instrukcji sterowanie przekazywane jest do pierwszej instrukcji za klauzul &.
Jeli wyjtek zostanie sprowokowany poza blokiem kodu chronionego (tzn. poza ramami
instrukcji &&) albo jeli w ramach instrukcji && brak jest klauzuli
skojarzonej ze zgoszonym wyjtkiem, program jest awaryjnie zatrzymywany. Zatrzymaniu towarzyszy wyprowadzenie stosownego komunikatu na wyjcie programu.
Instrukcje && mona na przykad wykorzysta do ochrony programu przed
skutkami wprowadzenia niepoprawnych danych:
42
43
Znaczenie
!=@ %.
!=( !
!;) @)@%A=
! =?#
!?
!(B C(
!B @* B)
!B A (
!D4B)
!(@%B
!?B E 97
!6(#F=
!FE7?9(159
!7#* ;
!7)(
!(D
!(D B9
!F9 @ %.
! B (
Bd instrukcji asercji
! ;
! 45
!= *
!5
! =
!)(
!
!D(
!%D 9
!%D7G
44
Znaczenie
!% ! A )
!%(@*
!%@ %.
!% 4?# 4
!%0( %.
!(C(
Popularna jest na przykad biblioteka UCR Standard Library dla programistw jzyka asemblerowego
procesorw 80x86.
45
jzyka HLA to nie tylko sam kod procedur, ale rwnie wysokopoziomowy interfejs
wywoa tych procedur. W rzeczy samej jzyk HLA powsta gwnie z myl o moliwoci tworzenia zestaww procedur bibliotecznych wysokiego poziomu. w wysokopoziomowy interfejs wywoa, w poczeniu z wysokopoziomow natur wielu procedur, daje programicie niespodziewanie wielkie i rwnoczenie atwo dostpne
moliwoci.
Biblioteka standardowa jzyka HLA skada si z szeregu moduw przypisanych do
kilku kategorii. Cz z dostpnych moduw zawiera tabela 1.55.
Tabela 1.5. Wybrane moduy biblioteki standardowej HLA
Nazwa moduu
Funkcje
args
conv
cset
DateTime
excepts
fileio
hla
hll
Linux
math
memory
misctypes
patterns
rand
stdin
stdout
stdlib
strings
tables
win32
x86
Z racji cigego rozwoju biblioteki standardowej jzyka HLA niniejsza lista nie jest zapewne kompletna.
Aktualnej listy moduw naley szuka w dokumentacji jzyka HLA.
46
Definicja
(,
(,
(,
Znak tabulacji
(%
(
47
wejciowego, ) bd ich przeznaczenia (dane kierowane do standardowego urzdzenia wyjciowego, ). Najczciej urzdzeniem wejciowym jest klawiatura konsoli systemowej. Urzdzenie wyjciowe to zwykle ekran konsoli. W oglnoci wic instrukcje z przedrostkiem bd realizuj odczyty i zapisy danych z i do
urzdzenia konsoli.
Przy uruchamianiu programu z poziomu wiersza polece (zwanego w Linuksie powok)
mona dokona przekierowania strumieni danych wejciowych i wyjciowych do
urzdze innych ni domylne. Na przykad argument wywoania programu w postaci
$.& powoduje przekierowanie standardowego wyjcia programu do pliku plik_wy.
Z kolei argument wywoania postaci $. powoduje przypisanie standardowego
wejcia programu do pliku rdowego plik_we. Oto przykady przekierowania standardowego wejcia i wyjcia programu % uruchamianego z poziomu wiersza
polece7:
*=9
*)(
*=9)*)!
*=9
!)!
Uwaga dla uytkownikw systemu Linux: w zalenoci od wartoci zmiennej rodowiskowej 5FC
nazw programu trzeba by moe poprzedzi znakami ./, np. I *=9
*)(.
48
49
50
Warto jedynie podkreli, e niniejsza procedura udostpnia programicie szereg waciwoci, ktre nie byy dotd prezentowane w przykadach. W szczeglnoci kady
z argumentw wywoania moe by zadany w jednej z dwch postaci:
-
Procedura obsuguje jednak wicej atrybutw. Bd one omawiane w kolejnych rozdziaach, w miar potrzeby ich wprowadzania do programw przykadowych.
9
51
10
52
53
9& !2'3
// Wywietl podane wartoci.
()*)
&
2
+@.*.(
,7-+222
+,.
, 4.-+2-22
+H,.
, 4.-+2H-22
+,.
, 4.-+2-2
'3
(*)3
Warto skompilowa i uruchomi powyszy program i sprawdzi, co si stanie, jeli wprowadzane liczby bd wykraczay poza dozwolony zakres albo cigi wartoci zawiera
bd niedozwolone znaki.
54
55
56
11
W programie HLA identyfikator ten umieszczany jest w rejestrze EAX. Std po przekazaniu sterowania
do odpowiedniej klauzuli ! * mona odwoywa si do identyfikatora wyjtku, odwoujc si
do rejestru EAX.
57
()*)&+6*.(
,8
,7()
+'3
(73
( (*)3
Na listingu 1.9 wida zagniedone dwa bloki instrukcji &&. Jeli w ramach
wykonania instrukcji % uytkownik wprowadzi warto wiksz od 4 miliardw
z kawakiem, procedura % podniesie wyjtek ++
,%. Kiedy wyjtek
ten zostanie przekazany do systemu wykonawczego HLA, nastpi przeszukanie klauzul
! biecego bloku && (tego, w ktrym nastpio zgoszenie wyjtku;
w prezentowanym przykadzie jest to blok zagniedony). Jeli nie uda si dopasowa
identyfikatora wyjtku ++
,% w biecym bloku &&, system
wykonawczy HLA sprawdzi, czy biecy blok && nie zosta zagniedony
w innym bloku && (co akurat ma miejsce na listingu 1.9). W takim przypadku
system wykonawczy HLA przeszuka rwnie klauzule ! bloku zewntrznego
(nadrzdnego). Na listingu 1.9 w blok zawiera klauzul z odpowiedni wartoci identyfikatora, wic sterowanie przekazywane jest do pierwszej instrukcji umieszczonej za
klauzul ! /++
,%0.
Po opuszczeniu bloku && system wykonawczy traktuje w blok jako nieaktywny i jeli teraz nastpi zgoszenie wyjtku, system wykonawczy HLA nie bdzie
przeszukiwa klauzul ! tego bloku12. Pozwala to na rnicowanie procedur
obsugi wyjtkw w rnych miejscach programu.
Jeli ten sam wyjtek obsuguj dwa bloki &&, a jeden z tych blokw jest
zagniedony w bloku chronionym pierwszego, to w momencie zgoszenia wyjtku
podczas wykonywania wewntrznego bloku chronionego system wykonawczy HLA
przekae sterowanie do kodu obsugi wyjtku w wewntrznym bloku &&.
Kod obsugi tego samego wyjtku w zewntrznym bloku jest ignorowany HLA nie
przekazuje sterowania do tego kodu.
W przykadzie z listingu 1.9 druga instrukcja && zostaa statycznie zagniedona w pierwszym bloku &&13. Wczeniej wspomniano, e jeli biecy blok
&& nie zawiera kodu obsugi zgoszonego wyjtku, nastpuje przeszukanie
klauzul ! kolejnych blokw &&, w ktrych blok biecy zosta zagniedony dynamicznie. W przypadku zagniedenia dynamicznego zagniedenie nie wynika wprost ze struktury kodu rdowego. Sterowanie moe zosta przekazane z wntrza
bloku && do zupenie innego miejsca programu, niby to wynikao z samej
struktury kodu. Jeli w tamtym miejscu realizowany jest blok chroniony instrukcji
&&, to mamy do czynienia z zagniedeniem dynamicznym. Zagniedenie dynamiczne mona zrealizowa na kilka sposobw, a najbardziej chyba intuicyjnym (i zapewne znanym Czytelnikowi z jzykw wysokiego poziomu) z nich jest wywoanie
12
13
Chyba e sterowanie zostanie wczeniej przekazane z powrotem do bloku 7 (7, na przykad
kiedy jest on umieszczony w ciele ptli.
Zagniedenie statyczne naley rozumie jako fizyczne, bo wynikajce wprost ze struktury kodu
rdowego, umieszczenie jednego bloku wewntrz drugiego. Kiedy mowa o zagniedaniu instrukcji,
zwykle chodzi o zagniedanie statyczne.
58
procedury. Kiedy wic w dalszej czci ksiki omawiany bdzie sposb pisania i wywoywania procedur w jzyku asemblerowym, naley pamita, e wywoanie procedury
z bloku kodu chronionego moe doprowadzi do dynamicznego zagniedenia blokw
&& wystarczy, aby procedura rwnie zawieraa blok && (i aby
zosta on wykonany).
59
// Uwaga: poniszy kod znajduje si poza ptl i nie jest osadzony w bloku chronionym
// instrukcji try..endtry
()*)&+5(88
8 (
, -+'3
(= &*)'3
()*)&+/.
,-+2*)2'3
( (*)L3
Niniejszy przykad z pozoru implementuje niezawodny, odporny na bdy system wprowadzania danych: wok bloku kodu chronionego rozcignita jest ptla wymuszajca
ponowne wprowadzenie danych przez uytkownika, jeli w poprzedniej prbie nie
udao si ich poprawnie odczyta. Pomys jest dobry; problem tkwi w jego nieprawidowej realizacji. Ot instrukcja $ powoduje opuszczenie ptli
bez przywrcenia poprzedniego stanu rodowiska wyjtkw. Z tego wzgldu, kiedy
program wykonuje procedur % umieszczon poza ptl (a tym bardziej poza
blokiem kodu chronionego), system obsugi wyjtkw wci traktuje jej kod jako chroniony. Jeli wic przy okazji jego wykonania zgoszony zostanie wyjtek, sterowanie
zostanie przekazane z powrotem do stosownej klauzuli ! opuszczonego ju
przecie bloku &&. Jeli identyfikatorem wyjtku bdzie ++
,%
albo ) *, wywietlony zostanie stosowny komunikat, a uytkownik
ponownie zmuszony bdzie do wprowadzenia liczby. Tego za programista raczej
nie przewidywa.
Przekazanie sterowania do nieodpowiedniego bloku && to tylko cz problemu. Kod z listingu 1.10 obarczony jest inn powan wad, zwizan ze sposobem
zachowywania i nastpnie przywracania przez system wykonawczy HLA rodowiska
wyjtkw. W szczeglnoci bowiem HLA zachowuje informacje o stanie systemu
wyjtkw w specjalnym obszarze pamici zwanym stosem. Jeli po wyjciu z bloku
&& stan rodowiska wyjtkw nie zostanie przywrcony, informacje o tym
rodowisku pozostan na stosie; obecno na nim nadmiarowych danych moe za doprowadzi do bdnego dziaania programu.
Jest ju chyba jasne, e program nie powinien opuszcza bloku && z pominiciem etapu przywrcenia pierwotnego stanu rodowiska wyjtkw. Wiadomo, e
sposb wprowadzania danych zaprezentowany na listingu 1.10 jest niepoprawny, ale
z drugiej strony sama koncepcja wymuszania powtarzania operacji wprowadzania a
do skutku jest jak najbardziej suszna. Mona j zaimplementowa przy uyciu specjalnej klauzuli bloku &&. Spjrzmy na kod z listingu 1.11.
Listing 1.11. Blok pozbawiony ochrony wewntrz bloku try..endtry
*=9 (*)3
J )( &+(,##%+'
*)-)3
, = (*)3
60
61
62
Poniewa mechanizm obsugi wyjtkw powoduje potencjalne zmiany wartoci rejestrw i poniewa obsuga wyjtkw to proces stosunkowo nieefektywny, nie powinno si
stosowa instrukcji & w roli zwykej struktury sterujcej wykonaniem programu (na
przykad symulujc w bloku && dziaanie instrukcji wyboru znanych z jzykw
wysokiego poziomu, jak ! czy !
). Takie praktyki wpywaj ujemnie na wydajno programu; mog tez wprowadza niepodane, trudne do wykrycia i zdiagnozowania efekty uboczne wynikajce z zakcania zawartoci rejestrw.
63
Dziaanie mechanizmu wyjtkw opiera si na zaoeniu, e rejestr EBP wykorzystywany jest wycznie w roli wskanika rekordw aktywacji (rekordy aktywacji
omawiane s w rozdziale powiconym procedurom). Standardowo programy HLA
wykorzystuj w rejestr wanie w tej roli. Warunkiem poprawnego dziaania programw jest wic unikanie modyfikowania zawartoci rejestru EBP. Jeli rejestr ten
zostanie uyty w roli rejestru oglnego przeznaczenia, na przykad w obliczeniach
arytmetycznych, obsuga wyjtkw systemu wykonawczego HLA nie bdzie dziaa
poprawnie, pojawi si te mog dodatkowe problemy. To samo tyczy si zreszt rejestru ESP jego rwnie nie naley wykorzystywa jako rejestru oglnego przeznaczenia.