[ Pobierz całość w formacie PDF ]
Procedura obsługuje jednak więcej atrybutów. Będą one omawiane w kolej-
nych rozdziałach, w miarę potrzeby ich wprowadzania do programów przykładowych.
9
W odróżnieniu od procedur stdout.putiNSize nie da się tu określić dowolnego znaku wypełnienia
znakiem tym jest domyślnie znak spacji. W obliczu konieczności zastosowania innego wypełnienia
należy skorzystać z procedur stdout.putiNSize.
Rozdział 1. f& Wstęp do języka asemblerowego 51
1.10.7. Procedura stdin.getc
Procedura wczytuje pojedynczy znak z bufora urządzenia standardowego
wejścia10. Znak ten umieszczany jest po wyjściu z procedury w rejestrze AL. Zastosowa-
nie procedury ilustruje program z listingu 1.6.
Listing 1.6. Demonstracja działania procedury stdin.getc
// Poniższa pętla wykonywana jest dopóty,
// dopóki użytkownik potwierdza wykonanie kolejnej iteracji.
// Wyprowadz 14 wartości.
// Zaczekaj, aż użytkownik naciśnie 't' albo 'n'.
10
Bufor to w tym kontekście ładniejsza nazwa tablicy.
52 Asembler. Szt ka programowania
W powyższym programie wywołanie procedury służy do wymuszenia
przejścia do nowego wiersza strumienia wejściowego. Szczegółowy opis tej procedury
znajduje się nieco dalej, w niniejszym rozdziale.
1.10.8. Procedury stdin.getiN
Procedury , oraz realizują operację wczytania
z urządzenia standardowego wejścia odpowiednio: 8-bitowej, 16-bitowej i 32-bitowej
wartości liczbowej całkowitej. Wczytane wartości umieszczane są w rejestrach AL, AX
bądz EAX. Niniejsze procedury stanowią standardowy sposób wczytywania liczb całko-
witych ze znakiem do programów języka HLA.
Podobnie jak procedura , procedury wczytują ze standardowego
wejścia sekwencję znaków. W sekwencji tej ignorowane są wszelkie początkowe znaki
odstępów (spacje, znaki tabulacji i tak dalej); reszta sekwencji (zawierająca cyfry poprze-
dzone opcjonalnym znakiem minusa) konwertowana jest do postaci liczbowej. W przy-
padku, kiedy sekwencja wejściowa zawiera znaki inne niż dozwolone lub wprowadzona
wartość nie mieści się w zakresie liczbowym charakterystycznym dla danej procedury,
zgłaszany jest wyjątek (można go przechwycić, umieszczając wywołanie procedury
w bloku kodu chronionego w instrukcji ). Procedura obsługuje
liczby z zakresu od 128 do 127, od 32 768 do 32 767; wartości
wczytywane do programu za pośrednictwem procedury muszą zaś mieścić
się w przedziale od 2 147 483 648 do 2 147 483 647.
Sposób wykorzystania owych procedur ilustruje listing 1.7.
Listing 1.7. Przykład wykorzystania wywołań stdin.getiN
// Pobierz od użytkownika kilka liczb całkowitych różnej wielkości.
Rozdział 1. f& Wstęp do języka asemblerowego 53
// Wyświetl podane wartości.
Warto skompilować i uruchomić powyższy program i sprawdzić, co się stanie, jeśli wpro-
wadzane liczby będą wykraczały poza dozwolony zakres albo ciągi wartości zawierać
będą niedozwolone znaki.
1.10.9. Procedury stdin.readLn i stdin.flushInput
Moment wywołania procedury czy nie musi być tożsamy z mo-
mentem wprowadzenia danych przez użytkownika. Biblioteka standardowa języka HLA
buforuje dane wprowadzane na standardowe wejście, wczytując jednorazowo cały
wiersz tekstu wprowadzanego na to wejście. Wywołanie procedury wejścia może więc
zostać zrealizowane za pośrednictwem operacji odczytu danych z bufora wejściowego
(o ile ten nie jest pusty). Choć buforowanie w ogólności poprawia efektywność mani-
pulowania danymi wejściowymi, niekiedy wprowadza zamieszanie, jak w poniższym
przykładzie:
Programista ma nadzieję, że wykonanie powyższego kodu da następujący efekt: program
wyświetli monit o podanie liczby, zaczeka na wprowadzenie jej przez użytkownika,
wyświetli kolejny monit i również zaczeka na wprowadzenie liczby. W rzeczywistości
program może mieć nieco inny przebieg. Jeśli, na przykład, powyższy kod zostanie uru-
chomiony, a użytkownik w odpowiedzi na pierwszy monit wprowadzi łańcuch 123 456
program nie będzie już po wyświetleniu drugiego monitu oczekiwał na wprowadzenie
danych procedura odczyta po prostu drugi z wprowadzonych do bufora
wejściowego łańcuchów (456).
Procedury wejścia oczekują na wprowadzenie tekstu przez użytkownika jedynie wtedy,
kiedy bufor wejściowy jest pusty. Dopóki zawiera on jakiekolwiek znaki, procedury
wejścia ograniczają się do odczytu z bufora. Można to wykorzystać, konstruując na-
stępujący kod:
54 Asembler. Szt ka programowania
Tutaj zezwala się wprost użytkownikowi na jednorazowe (w ramach pojedynczego
wiersza) wprowadzenie dwóch liczb. Liczby te powinny zostać oddzielone jednym bądz
kilkoma znakami odstępu. Pozwala to na zaoszczędzenie miejsca na ekranie. Tutaj
buforowanie danych wejściowych okazało się korzystne. Kiedy indziej jednak może
być odwrotnie.
Na szczęście biblioteka standardowa języka HLA przewiduje dwie procedury sterujące
działaniem bufora standardowego urządzenia wejściowego. Są to procedury
oraz . Pierwsza z nich usuwa z bufora wszystko, co zostało w nim
umieszczone wcześniej, i tym samym wymusza wprowadzenie przez użytkownika nowe-
go wiersza danych. Druga po prostu usuwa całą zawartość bufora. Oczyszczenie bufora
powoduje, że przy następnym wywołaniu dowolnej z procedur wejścia, użytkownik
[ Pobierz całość w formacie PDF ]