Vlákno názorů k článku Co se Benderovi honí hlavou od Daniel Kavan - Mám dotaz k volání funkce s parametry. Když...

  • Článek je starý, nové názory již nelze přidávat.
  • 24. 4. 2008 7:43

    Daniel Kavan (neregistrovaný)
    Mám dotaz k volání funkce s parametry. Když parametry pomocí PUSH uložím, pak zavolám funkci pomocí CALL (uloží na zásobník návratovou adresu), pak první POP ve funkci vrací tuto návratovou adresu, nebo ne?
    Poddotaz k NOP (jen pro zajímavost). Assembler znám jen ze Z80 a tam bylo NOP jako nulový bajt, přišlo mi to šikovné, protože "prázdná" pamět nic nedělá a myslel jsem, že je to pravidlem u všech procesorů, pletl jsem se, nebo je to jen u tohoto ukázkového, protože to tak prostě vyšlo?
    Díky za odpovědi.
  • 24. 4. 2008 9:00

    Pavel Tišnovský
    Zlatý podporovatel
    Máte pravdu, návratovou adresu není možné zahodit a vzhledem k tomu, že tento mikroprocesor neumožňuje relativní adresování vůči SP ani SP aritmetiku (nejde například udělat ADD SP,#2), tak je nutné návratovou adresu ručně uložit a potom opět obnovit. Na toto jsem v komentářích zapoměl.

    NOP - to je taky zajímavá otázka. Například 6502 mělo pro opkód 0x00 instrukci BRK, tedy BREAK a to mi připadne trošku vhodnější. Když například na konci svého assemblerovského programu zapomenu RET nebo něco na způsob EXIT 0 (podle pravidel daného OS, například v DOSu int 20h), tak by se v případě NOPů prostě pokračovalo dále až např. (v případě Z80 a jeho typických použití) někam ke grafické paměti. Kdežto BRK natvrdo program zastaví.

    Ale mnoho mikroprocesorů, například i x86 to prostě nijak neřeší a na 0x00 je tuším také ADD, stejně jako v případě tohoto ukázkového mikroprocesoru, ale to je spíš náhoda, protože zrovna instrukční sadu x86 nemám rád.
  • 26. 4. 2008 7:09

    miklik
    S předáním parametrů funkci to bude spíše takto:

    ; sekvence instrukcí volající funkci
    PUSH A ; uložení registru A do zásobníku
    PUSH B ; uložení registru B do zásobníku
    LD A,param1 ; načtení prvního parametru funkce
    LD B,param2 ; načtení druhého parametru funkce
    CALL funkce ; zavolání funkce (a uložení návratové adresy na zásobník)
    POP B ; obnovení registru B
    POP A ; obnovení registru A
    ...
    ...

    ; tělo funkce funkce:

    ...
    ...
    ...
    RET ; provedení zpětného skoku