A teraz sa uz mozeme priamo vrhnut na popis jednotlivych instrukcii. Pri instrukciach, ktore maju dva operandy, zdrojovy aj cielovy operand musia mat rovnaku sirku v bitoch - mozu byt 8 alebo 16 bitove. Ako zdroj moze byt pouzity aj priamy operand. Segmentove registre sa ako operandy nedaju pouzivat. Okrem instrukcii pre nasobenie a delenie moze ako operand 'src' byt pouzity aj priamy operand.
Vsetky aritmeticke instrukcie vykonavajuce zakladne matematicke operacie su uvedene v nasledujucej tabulke ('dest' znamena cielovy operand, kam sa zapise vysledok operacie, 'src' znamena zdrojovy operand):
Instrukcia | operacia | anglicky nazov |
INC dest | dest = dest + 1 | inkrement |
DEC dest | dest = dest - 1 | dekrement |
NEG dest | dest = 0 - dest | negate |
ADD dest,src | dest = dest + src | addition |
SUB dest,scr | dest = dest - src | substraction |
ADC dest,src | dest = dest + src + CF | addition |
SUB dest,src | dest = dest - src - CF | substraction |
CMP dest,src | dest - scr | compare |
MUL scr ; IMUL src | ext:acc = acc * src | multiplication |
DIV scr ; IDIV src | acc = ext:acc / src ext = ext:acc % src |
division |
Instrukcie INC a DEC nemenia hodnotu priznaku CF.
Vsimnime si ze instrukcia CMP robi vlastne odcitanie a potom podla vysledku upravi priznaky, ale vysledok samotnej operacie nikam nezapisuje. Ako uz sam anglicky nazov napoveda, pouziva sa na porovnavanie dvoch hodnot (compare=porovnavat).
Instrukcie pre nasobenie a delenie maju kazda dve verzie - bez a s pismenkom 'I' na zaciatku mnemotechnickeho nazvu. Instrukcia bez 'I' znamena, ze vstupne operandy aj vysledok su v priamom kode, kym s 'I' znamena ze zdrojove operandy aj vysledok su zase v doplnkovom kode.
Instrukcie nasobenia vzdy nasobia akumulator zdrojovym operandom. Ako operand moze byt pouzity nejaky bezny register alebo pametove miesto. Ak je operand 8-bitovy, potom je nim vynasobeny AL a cely vysledok sa zapise do AX. CF a OF sa nastavia ak je AH nenulovy (teda ak sa vysledok nezmesti do samotneho AL). V tomto pripade znacka 'acc' predstavuje AL a znacka 'ext' zase predstavuje AH. Naproti tomu zase ak je operand 16-bitovy, tak potom znacka 'acc' predstavuje cely akumulator AX a znacka 'ext' znamena register DX. To znamena ze vtedy sa operandom nasobi AX a 32-bitovy vysledok sa zapise do registrov DX:AX. CF a OF sa nastavia ak sa vysledok nezmesti do samotneho AX.
Vyznam symbolov 'ext' a 'acc' pri operaciach delenia je presne taky isty. Ak je teda operand 8-bitovy, cislo ulozene v AX je podelene operandom, celociselna cast vysledku sa ulozi do AL a zvysok po deleni (modulo, v tabulke je oznacene znakom '%') sa ulozi do AH. Ak je ale operand 16-bitovy, celociselna cast vysledku delenia cisla v registroch DX:AX operandom sa vlozi do registra AX a zvysok po deleni zase do registra DX.
Akonahle sa pri operacii delenia stane, ze celociselna cast vysledku sa nezmesti do registra pre nu urceneho, vygeneruje sa prerusenie typu 0 (INT 0). Blizsie si o tomto preruseni povieme v casti o instrukciach na riadenie behu programu. Vysledok sa moze nezmestit z dvoch dovodov:
Okrem instrukcii priamo vykonavajucich matematicke operacie do skupiny aritmetickych instrukcii zaradujeme aj celu plejadu instrukcii pre rozne desiatkove korekcie a znamienkove rozsirenia:
AAA | robi upravu vysledku scitania dvoch cisel v rozvinutom dekadickom tvare v registri AL tak, aby vysledok bol znova v rozvinutom tvare. |
DAA | robi upravu vysledku scitania dvoch cisel v kompaktnom tvare v registre AL tak, aby vysledok bol znova v kompaktnom tvare. |
AAS | robi upravu vysledku odcitania dvoch cisel v rozvinutom tvare v registri AL tak aby vysledok bol znova v rozvinutom tvare. |
DAS | robi upravu vysledku odcitania dvoch cisel v kompaktnom tvare v registre AL tak, aby vysledok bol znova v kompaktnom tvare. |
AAM | robi upravu vysledku nasobenia dvoch cisel v rozvinutom dekadickom tvare v registri AX tak, aby vysledok bol znova v rozvinutom tvare. |
AAD | robi upravu delenca v registri AL pred delenim dvoch cisel v rozvinutom tvare tak, aby podiel bol znova v rozvinutom tvare. |
CBW | robi znamienkove rozsirenie registra AL do registra AH. Ludsky povedane, obsah siedmeho bitu AL sa ulozi do vsetkych bitov registra AH. To znamena, ze ake cislo v doplnkovom formate bolo predtym v registri AL, presne take iste bude teraz v registri AX. |
CWD | robi znamienkove rozsirenie registra AX do registra DX. Je to velmi podobne ako pri CBW, ale tu sa obsah petnasteho bitu AX sa ulozi do vsetkych bitov registra DX. To znamena, ze ake cislo v doplnkovom formate bolo predtym v registri AX, take bude teraz v dvojici registrov DX:AX. |