Skoky a podprogramy - M8C

Z Kiwiki
Verzia z 20:46, 21. jún 2010, ktorú vytvoril David (diskusia | príspevky) (Vytvorená stránka „Volanie podprogramu spočíva v uložení parametrov do zásobníka a zmene adresy v registri IP (čítač inštrukcií) na adresu podprogramu s tým, že je uschovaná adr…“)
(rozdiel) ← Staršia verzia | Aktuálna úprava (rozdiel) | Novšia verzia → (rozdiel)
Skočit na navigaci Skočit na vyhledávání

Volanie podprogramu spočíva v uložení parametrov do zásobníka a zmene adresy v registri IP (čítač inštrukcií) na adresu podprogramu s tým, že je uschovaná adresa odkiaľ prevádzame volanie (to aby procesor vedel kam sa má vrátiť). Parametre do zásobníku ukladáme my, zvyšok zariadi inštrukcia CALL.

Ukladanie parametrov do zásobníka

V hlavičke procedúry (alebo funkcie) nájdeme takmer vždy definíciu parametrov volaných:

  • hodnotou - podprogram ich hodnoty iba využíva
  • odkazom - podprogram ich môže čítať a môže do nich i zapísať

Napríklad: void sucet (word a, word b, word &c) je definícia procedúry s názvom súčet s parametrami a, b volanými hodnotou a c volaným odkazom. Pri volaní tejto procedúry z niektorej časti programu písanom v C++ na miesta a, b zapíšeme konkrétne hodnoty (alebo premenné (tie ale podprogram nezmení) s týmito hodnotami) a na miesto c zapíšeme premennú, v ktorej nájdeme hodnotu po prevedení procedúry (napr. sucet (1,3,premenna_c);). Z miesta volania predávame parametre do podprogramov vždy cez zásobník v opačnom poradí ako je v definícii hlavičky podprogramu (prvá premenná bude na vrchole zásobníka). Do zásobníka pred volaním procedúry ukladáme odlišne parametre volané hodnotou a odkazom.

Pri volaní hodnotou

Uložíme konkrétne hodnoty (prečítané napr. i z pamäti). Vzhľadom k organizácii zásobníka sú parametre volané hodnotou uložené po slovách nasledovne:

  • parametre o dĺžke jednej slabiky (byte, short int, char, bool) - obsadia celé slovo (pamäťou nešetria)
  • parametre o dĺžke jedného slova (word, int) - obsadia slovo
  • parametre o dĺžke dvojslova (pointer, long int) - obsadia dve slova (ukazovateľ je adresa, do zásobníka teda najskôr uložíme segmentovú a potom offsetovú časť adresy)
  • parametre o dĺžke 6 slabík (float) - obsadia v zásobníku tri slová
  • parametre dlhšie (reťazce, množina, pole, záznamy) - sa ukladajú ako ukazovatele na hodnotu.

Pri volaní odkazom

Uložíme celú adresu miesta (teda segment i offset) odkiaľ sa má hodnota čítať alebo kam sa má zapísať (to je vlastne obsah ukazovateľa na pamäťové miesto).

Samotné volanie podprogramu

Musíme rozlišovať volanie blízkeho podprogramu a vzdialeného. Za vzdialený v tomto prípade považujeme podprogram s adresou v odlišnom segmente. I keď sa pre programátora nič nemení je dobré vedieť, že pri vzdialenom volaní sa mení nie len IP, ale i CS. Označenie miesta skoku nesie teda naviac informáciu o segmentovej adrese. Skok do podprogramu zaistí inštrukcia

CALL

adresa - na vrchol zásobníka ulož obsah (CS pri vzdialenom volaní a) IP a naplň tieto registre adresou uvedenou v parametri (pre nás slovo adresa nahradíme názvom podprogramu)

Ukončení samotného podprogramu zaistí inštrukcia

RET[F]

z vrcholu zásobníka vezmi adresy a dosaď ich do (CS a) IP Volanie podprogramov je teda jednoduché.

Jednoducho napíšeme inštrukciu CALL s menom podprogramu (teda procedúry alebo funkcie). Ostatné zariadi prekladač, ktorý zistí, či sa jedná o blízke alebo vzdialené volanie. Podľa toho dosadí adresu. Návrat si opäť zariadi prekladač pri ukončení podprogramu.

Za volaním programu musíme uvolniť zásobník, teda musíme vybrať toľko hodnôt, koľko sme ich vložili pred volaním podprogramu (počet parametrov podprogramu).