RET - návrat z procedúry

Z Delphi & Pascal (česká wiki)
Verze z 11. 1. 2013, 18:14, kterou vytvořil Zdeno Sekerák (diskuse | příspěvky) (1 revízia: Assembler pismeno R-S)
(rozdíl) ← Starší verze | zobrazit aktuální verzi (rozdíl) | Novější verze → (rozdíl)
Skočit na navigaci Skočit na vyhledávání
Instrukce
RET - návrat z procedúry
Časování
15-55 (80286), 10-68 (80386)
Popis
Instrukce zabezpečuje pokračování programu tím, že prěnese řízení progamu na adresu návratu, která byla (při volání procedúry) uložená do zásobníku. Tato adresa je obvykle umístěna do zásobníku instrukci CALL. Intrasegmentové (NEAR) návraty RET plní registr instrukce (instruction pointer) dvěma nejhornejšími byty umístěnými na vrcholu zásobníku. Tyto dva byty udávají offset instrukce která má být vykonávaná jako další. Intersegmentové (FAR) návraty RET začínají stějne jako intrasegmentové přenesením horních dvou byte ze zásobníku (t.j. offset příští vykonávané instrukce). Jako další akce je však provedeno naplnění registru CS dalšími dvěma byte ze zásobníku. Tyto další dva byte obsahují adresu segmentu v němž leží příští vykonávaná instrukce. Abychom provedli intrasegmentový návrat RET a změnili ukazatele zásobníku je tedy trěba zavést horní dva byte ze zásobníku do registru instrukce. Pak je trěba zaéest další dva byte ze zásobníku do ukazatele zásobníku (stack pointer). Tyto poslední dva byte znovu nastaví poslední obsah ukazatele zásobníku jenž mohl případne být uložen na vrchol zásobníku před instrukci CALL. Abychom provedli intersegmentový návrat RET a zmenili ukazatele zásobníku je trěba opět zavést horní dva byte ze zásobníku do registru. To je offset příští vykonávané instrukce. Další dva byte jsou ze zásobníku zavedeny do registru CS. To je adresa segmentu v němž leží příští vykonávaná instrukce. Další dva byte ze zásobníku se musí uložit do ukazatele zásobníku ze stejných pohnútek jako při intrasegmentovém návratu.


Syntaxe
RET (žádné operandy)


Ovlivňuje příznaky
žádné


Nedefinované příznaky
žádné


Výjimky v privilegovaném módu
V některých případech je generována všeobecná výjimka porušení ochrany paměti, výjimka "deskriptor není přítomen" nebo výjimka "chyba zásobníku".


Výjimky v reálnem módu
Jestliže je slovní operand na offsetu 0FFFFH je generováno přerušení INT 13.


Poznámka pro 80386
Je používan 32-bitový rozšířený ukazatel instrukce. Ze zásobníku je vyzvedaván 32-bitový EIP.


Příklad
RET