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.
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.
; 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
...
...