148
5. Rozkazy mikroprocesorów 8086/8088
11111111 mod 101 r/m addrjow addrhigh
Liczba taktów - 24 + takty do obliczenia adresu efektywnego.
Przykład
JMP ZMIENNA PODWOJNE SLOWO[BP + 2] • JMP DWORD PTR [SI]
CALL (ang. cali a procedurę ) wywołanie podprogramu
Operacja: zob. opis Znaczniki: bez zmian
Rozkaz powoduje wywołanie podprogramu, czyli przekazanie sterowania do podprogramu z równoczesnym (automatycznym) zapamiętaniem w stosie informacji
0 adresie powrotu do programu wywołującego. Adres podprogramu może wynikać wprost z argumentu rozkazu (skok bezpośredni) lub może być pobrany z rcjestru(ów) lub pamięci (skok pośredni). Wywoływany podprogram mo/c znajdować się w tym samym segmencie (podprogram bliski - NEAR) co program wywołujący i wtedy jego adres jak i adres powrotu zapamiętany w stosie ogranicza się do 16-bitowego adresu względem początku segmentu, lub w innym segmencie (podprogram daleki - FAR)
1 wtedy oba adresy muszą być 32-bitowe (część SEGMENT i OFFSET). Możliwe opcje rozkazu CALL zestawiono w tabl. 5.13. Aby był możliwy powrót do programu wywołującego, podprogram musi być zakończony odpowiednim rozkazem RET (NEAR lub FAR).
Tablica 5.13. Rodzaje rozkazu CALL
Skok |
Skok pośredni przez |
Adres powrotu | ||
bezpośredni |
rejestr |
pamięć |
w stosie | |
WewnÄ…trz segmentu |
tak |
tak |
tak |
1 słowo |
Między segmentami |
tak |
nie |
tak |
2 słowa |
Bezpośrednie wywołanie podprogramu wewnątrz segmentu
Operacja: SP«—SP-2; next M[SP + l]oM[SP]+-IP; next IP«-IP 4-disp highodisp low
1110 1000 displow disphigh Liczba taktów - 19.
Przykład
CALL PODPROGRAM BLISKI
CALL NEAR PROC ♦
Bezpośrednie wywołanie podprogramu między segmentami
Operacja: SP*-SP-2; next M[SP + l]oM[SP] «-CS; next CS<-scg_highoseg_low;
powered by
5.5. Rozkazy sterowania skokami
next SP«-SP-2; nexl M[SP + l]oM[SP]«-IP; next IP<-offset_highooffseTTÓ^^^^^^™ |j001 1010 offsetjow offset_high seg_low seg_high
Liczba taktów - 28.
Przykład
CALL PODROGRAMDALEKI
CALL FAR PROC 4
Pośrednie wywołanie podprogramu przez rejestr wewnątrz segmentu Operacja: SP.-SP-2; next M[SP + l]oM[SP]«-IP; next IP«-regl6
11111111 11 010 reg
Liczha taktów -16.
Przykład
CALL BX CALL Dl CALL BP
CALL CX 4
Pośrednie wywołanie podprogramu przez pamięć wewnątrz segmentu Operacja: SP.-SP-2; next M[SP+ l]oM[SP]«-IP; next IP*-M[ea + l]oM[ea]
11111111 modOlOr/m addrlow addrhigh
Liczba taktów - 21 + takty do obliczenia adresu efektywnego.
Przykład
CALL WSKAZNIK[BX + 8]
CALL WORD PTR [BP] ♦
Pośrednie wywołanie podprogramu przez pamięć między segmentami Operacja: SP.-SP-2; next M[SP + l]oM[SP]«-CS; next CS^-M[ea + 3]oM]ea + 2]; next SP.-SP-2; nett M[SP + l]oM[SP]«-IP; next IP«-M[ea + l]oM[ea]
[lin 1111 mod011r/m addrlow addrhigh
Liczba taktów - 37 + takty do obliczenia adresu efektywnego.
Przykład
CALL ZMIENNA_PODWOJNE_SLOWO[SI + 2]
♦
CALL DWORD PTR [BP]