188
7. Wybrane techniki programowania
Opisany mechanizm jest bardzo skutecznym narzędziem do tworzenia własnej biblioteki podprogramów wcześniej sprawdzanych, uruchomionych i wykorzystanych. Taka biblioteka ułatwia budowę nowych programów.
Stos odgrywa ważną rolę przy przekazywaniu parametrów do (z) podprogramów. Istnieją cztery sposoby przekazywania parametrów.
Przekazywanie parametrów przez rejestr}> - metoda najprostsza i najszybsza, ale posiadająca liczne wady, z których najistotniejsze to brak możliwości przekazania wprost większej liczby danych oraz konieczność skrupulatnego zachowania stanu rejestrów, gdy dane są przekazywane przez wiele poziomów odwołań.
Przekazywanie parametrów przez wspólny obszar pamięci - sposób pozwala przekazać dużą liczbę parametrów, wymaga jednak uwagi przy programowaniu, łatwo bowiem utracić panowanie nad obszarem pamięci, do którego różne procedury mogą zapisywać informacje. Metoda jest łączona najczęściej z poprzednią; przez rejestr(y) jest przekazywany adres omawianego wspólnego obszaru pamięci.
Przekazywanie parametrów przez listę umieszczoną w treści programu - w segmencie programu za rozkazem wywołania umieszcza się parametry w kolejnych bajtach. Wymaga to modyfikowania adresu powrotu z podprogramu, a także modyfikowania fragmentu segmentu programu, w którym mają być umieszczone parametry, co nie zawsze jest możliwe (np. program rezyduje w pamięci EPROM), a prawie zawsze jest niewskazane. Przykłady stosowania wymienionych metod znajdzie Czytelnik w publikacjach [5] i [8]. My zajmiemy się szerzej czwartą metodą, wykorzystującą stos.
Przekazywanie parametrów przez stos - metoda nawiązująca do języków wysokiego poziomu, dla których przekazywanie parametrów przez stos jest rozwiązaniem standardowym. Przekazywanie parametrów do (z) podprogramu przez stos może wydawać się w pierwszej chwili uciążliwe i mało wydajne. Spośród wszystkich wymienionych wyżej metod, ta zapewnia największą dyscyplinę programowania, a tym samym znacznie zmniejsza prawdopodobieństwo popełnienia błędu, zwłaszcza w przypadku wielu poziomów odwołań. Ułatwia ona konstruowanie procedur współużywalnych i jako jedyna może zagwarantować prawidłowe współdziałanie modułów programowych napisanych w różnych językach programowania. Metodę pokazano na przykładzie i rys. 7.4.
Przykład
; program wywołujący podprogram
•• •
EXTRN PODPROGRAMiFAR
• • •
BAJT DB ? ; deklaracja zmiennych
SŁOWO DW ? ; będących parametrami wywołania
SLOWO_2 DD ? ; podprogramu
TABLICA DW 100 DUP (?)
WYNIK DW ?
powered by
7.1. Podprogramy. Praca z segmentami stosu
; przygotowanie parametrów wejściowych MOV AL, BAJT
PUSH AX ; trzeba zapisać całe słowo
PUSH SŁOWO
PUSH WORD PTR SLOWO_2 ; mniej znacząca część zmiennej PUSH WORD PTR SLOWO_2 + 2 ; bardziej znacząca część zmiennej
MOV AX, OFFSET TABLICA PUSH AX
MOV AX, LENGTH TABLICA PUSH AX
; przesłanie offsetu dla parametru wyjściowego MOV AX, OFFSET WYNIK PUSH AX
; wywołanie podprogramu CALL PODPROGRAM
Początkowy fragment wywoływanego podprogramu może mieć postać
PUSH BX PUSH CX PUSH SI PUSH DI PUSH BP MOV BP, SP
MOV CX,[BP 4-16] MOV BX,[BP + 18]
• • •
MOV DI,[BP +14] MOV AX,[BP + 26]
MOV BX,[BP + 24| MOV AX,[BP + 22] MOV DX,[BP + 20)
wszystkie używane w podprogramie rejestry powinny być bezwzględnie odtworzone po powrocie do programu wywołującego
rejestr BP wskazuje teraz szczyt stosu
standardowo rejestr BP adresuje
segment stosu
długość tablicy
offset tablicy
jakaś operacja na tablicy
offset wyniku
w akumulatorze jest zmienna BAJT
w rejestrze BX jest wartość zmiennej SŁOWO rejestry AX i DX zawierają zmienną SŁOWO 2 (słowo podwójne)
obliczony wynik
odtworzenie zawartości rejestrów
MOV[DI],AX POP BP POP DI POP SI POP CX POP BX
RET 14 ; dodatkowo: SP<—SP + 14
; SP wskazuje tę samą warstwę stosu co przed przesłaniem ; do stosu parametrów wywołania