PSEUDOINSTRUKCIE

Zacneme tym, ze si vysvetlime pojem preudoinstrukcia (nasiel som ho v slovniku cudzich slov). Pseudoinstrukcia - poznamky vyjadrene v programe v tvare instrukcie, ktora sluzi na orientaciu v nom, alebo urcuje parametre jeho prekladu do strojoveho kodu. K tomuto odbornemu vysvetleniu len tolko, ze pseudoinstrukcia je vlastne druh makra. Cize, ak v zdrojovom texte uvediete napr. instrukciu RCR AX,4 - po preklade ju prekladac nahradi blokom instrukcii. Pseudoinstrukcie zmensuju dlzku zdrojoveho textu.

PUSH a POP - tieto pseudoinstrukcie nahradzuju postupnost instrukcii PUSH a POP s jednotlivymi registrami, dalej umoznuju ulozenie konstanty na zasobnik, ulozenie a vybratie dalekeho ukazovatela.

1. Syntax: PUSH zoznam_registrov

POP zoznam_registrov

Priklad: PUSH AX BX CX DX

POP DX CX BX AX

2. Syntax: PUSH konstanta

V instrukcnom subore procesora 80186 a vyssich je obsiahnuta i instrukcia ulozenia konstanty do zasobnika. V instrukcnom procesora 8086 vsak tato instrukcia chyba. Preto prekladac definuje pri instrukcnom subore procesora 8086 pseudoinstrukciu PUSH konstanta, ktora je pri preklade nahradena postupnostou legalnych instrukcii, t.j. instrukcii, ktore su pre dany procesor vykonatelne.

3. Syntax: PUSH daleky_ukazovatel

POP daleky_ukazovatel

Aby mohol programator ulozit aj vybrat zo zasobnika aj daleky ukazovatel je mozne pouzit pseudoinstrukcie PUSH a POP daleky_ukazovatel. V 16-bitovych procesoroch je velkost dalekeho ukazovatela 4 bajty, ale maximalna velkost slova s ktorou pracuju instrukcie PUSH a POP, je 2 bajty. Preto je pseudoinstrukcia prelozena ako postupnost dvoch instrukcii PUSH a POP.

CALL - tato pseudoinstrukcia sluzi k jednoduchsiemu volaniu funkcii v assembleri a vo vyssich programovacich jazykoch.

Syntax: CALL meno_procedury [jazyk], argument, argument...

Pouzitim tejto pseudoinstrukcie sa programator zbavuje nutnosti poznat volaciu konvenciu jednotlivych jazykov. Jazyk moze byt jeden z nasledujucich: BASIC, C, CPP, FORTRAN, PASCAL, PROLOG, SYSCALL, alebo NOLANGUAGE. Argumenty su parametre procedury, ktore prekladac podla zvolenej volacej konvencie umiestni do zasobnika.

RETN, RETF, RETCODE - tieto pseudoinstrukcie je mozne pouzit miesto beznej instrukcie RET vsade tam, kde si prajeme vyjadrit typ instrukcie (daleky/blizky navrat).

RETN - generuje vzdy blizky navrat, RETF - generuje vzdy daleky navrat, RETCODE - generuje navrat podla zvoleneho pamatoveho modelu. NEAR pre modely TINY, SMALL, COMPACT a TPASCAL. FAR pre modely MEDIUM, LARGE, HUGE a THUGE.

RCL, RCR, ROL, ROR, SHL, SHR, SAL, SAR - pseudoinstrukcie su vyuzitelne iba pre procesory 8086 a 8088. Pocet generovanych instrukcii sa uvadza priamo konstantou. Procesory 8086 a 8088 vsak dovoluju ako konstantu pouzit iba hodnotu 1. Pri pouziti pseudoinstrukcii je mozne zvolit i vyssiu hodnotu ako jedna. Prekladac potom instrukciu generuje n-krat s konstantou 1.

Priklad:

RCR AX,4

;Po preklade
RCR AX,1
RCR AX,1
RCR AX,1
RCR AX,1

SETFLAG, MASKFLEG, TESTFLAG, FLIPFLAG tieto pseudoinstrukcie nahradzaju bezne logicke funkcie a umoznuju vyhodnejsi preklad do strojoveho kodu.

SETFLAG=OR, MASKFLAG=AND, TESTFLAG=TEST, FLIPFLAG=XOR.

STARTUPCODE a .STARTUP - direktivy v zavislosti na zvolenom pamatovom modeli a modifikatore vytvaraju uvodny kod, ktory nastavuje segmentove registre DS a SS a offset zasobnika register SP. Zaroven direktiva vytvara navestie @STARTUP, ktore sa pouziva v spojeni s direktivou END.

Priklad:

.MODEL TINY
.CODE
.STARTUP
RCR AX,4
.EXIT
POLE DB 0,0,0,0,0,0,0,0
END @STARTUP

EXITCODE a .EXIT - direktivy v zavislosti na zvolenom operacnom systeme, vytvaraju kod, ktory ukonci program.

Syntax: EXITCODE [navratovy_kod]

.EXIT [navratovy_kod]