186 7. Wybrane techniki programowania
Przykład
• ••
ASSUME SS:STOS MOV AX, STOS
MOV SS, AX ; inicjalizacja rej. segmentowego MOV SP, OFFSET SZCZYT STOSU
♦
W przypadku uruchamiania programu pod kontrolą systemu operacyjnego MS-DOS, definiowanie segmentu stosu nieco upraszcza się, ponieważ program łączący automatycznie inicjuje rejestry SP i SS odpowiednimi wartościami. Dodatkowo należy określić, który z segmentów ma być traktowany jako segment stosu (zob. opis dyrektywy SEGMENT). Powyższa przykładowa definicja i inicjacja będzie miała postać
• • •
STOS SEGMENT STACK
DW 128 DUP (?)
STOS ENDS
• ••
ASSUME SS:STOS
• • •
Stos jest najczęściej wykorzystywany w programie
- automatycznie w czasie wykonywania niektórych rozkazów, np. CALL, RET, INT,
IRET; V
- do chwilowego zapamiętywania stanu rejestrów i niektórych zmiennych w przypadku, gdy ich stan trzeba będzie później odtworzyć, np. przy wykorzystaniu rozkazów POP, PUSH ilp.;
- przy konstrukcji podprogramów wielokrotnie wykorzystywanych w systemach wielozadaniowych;
- do przekazywania parametrów do (z) podprogramów.
Podprogramy w języku asemblerowym mikroprocesorów 8086/8088 mogą być umieszczane zarówno wewnątrz segmentu programu, w którym znajduje się program wywołujący je, jak i też w innych segmentach programu, tłumaczonych i uruchamianych oddzielnie. O ile w pierwszym przypadku wywołanie podprogramu i powrót z niego wiąże się jedynie z koniecznością zmiany zawartości wskaźnika rozkazów IP -o tyle w drugim przypadku, także ze zmianą zawartości rejestru segmentowego CS. Ponieważ w obu przypadkach asembler koduje rozkazy CALL i RET nieco inaczej (zob. p. 5.5.), rozróżnienie ich musi być dokonywane za pośrednictwem dyrektywy PROC/ENDP (zob. p. 4.3.3). Podprogram, który będzie wywoływany wyłącznie z zawierającego go segmentu programu, powinien być zadeklarowany bliski (NEAR)-
Przykład
PROGRAM SEGMENT
; tutaj jest program główny
CALL PODPROGRAM
7.1. Podprogramy. Praca z segmentami stosu
powered by
Mi sto!
• • •
CALL PODPROGRAM
; a tu się kończy ; początek podprogramu ; koniec podprogramu
HLT
PODPROGRAM PROC NEAR
• • •
RET
PODPROGRAM ENDP
PROGRAM ENDS ; koniec segmentu +
W przypadku, gdy podprogram ma być uruchamiany niezależnie od programu głównego (np. przez różnych programistów lub w różnym czasie), a później połączony z programem wywołującym, musi być on zdefiniowany w oddzielnym segmencie i zadeklarowany jako daleki (FAR). Równocześnie nazwa podprogramu musi być zdefiniowana jako zewnętrzna, przy czym tak jak opisano w p. 4.3.3, każdej dyrektywie EXTRN musi odpowiadać dyrektywa PUBLIC. Brak dyrektywy EXTRN (na zewnątrz definicji segmentu) spowoduje, że w czasie asemblacji segmentu z programem wywołującym, nazwa podprogramu będzie zasygnalizowana jako nie zdefiniowana.
Przykład
; w tym segmencie PODPR1 będzie wywoływany, choć nie jest ; w nim zdefiniowany
EXTRN PODPR_l:FAR
PROGRAMGLOWNY SEGMENT
• ••
CALL PODPR1
• ••
CALL PODPR 1
PROGRAM GŁÓWNY ENDS
END
; kolejny segment zawiera wywoływany podprogram i będzie ; tłumaczony niezależnie od segmentu poprzedniego PODPROGRAMY segment
PUBLIC PODPR1,...
PODPR 1 PROC FAR
; treść podprogramu
PODPR 1 |
RET ENDP |
PODPROGRAMY |
••• ENDS |
END |
; np. inne podprogramy