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):

Instrukciaoperaciaanglicky nazov
INC destdest = dest + 1inkrement
DEC destdest = dest - 1dekrement
NEG destdest = 0 - destnegate
ADD dest,srcdest = dest + srcaddition
SUB dest,scrdest = dest - srcsubstraction
ADC dest,srcdest = dest + src + CFaddition
SUB dest,srcdest = dest - src - CFsubstraction
CMP dest,srcdest - scrcompare
MUL scr ; IMUL srcext:acc = acc * srcmultiplication
DIV scr ; IDIV srcacc = 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:

  1. pomer delenca a delitela je prilis veliky (napr. ak je v AX hodnota 65000 a snazime sa ju vydelit 8-bitovym operandom ktory ma hodnotu 10)
  2. delitel ma nulovu hodnotu a tym padom sa snazime delit nulou.

   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.

Nazad na obsah , predchadzajuca a dalsia lekcia