Učebnice Assembleru 86

Instrukce skoku

Protože si mikroprocesor vytváří frontu instrukcí, nejsou z hlediska rychlosti běhu programu skoky to pravé. Přesto bychom složitější programy bez nich asi těžko tvořili. Abychom mohli instrukce skoku používat, musíme umět vytvořit návěští.

Návěští

Assembler je správně jen název překladače "Jazyka symbolických adres", který se pro něj čassem vžil. Název "Jazyk symbolických adres" vyjadřuje to, že místo adres instrukcí používáme symboly. V Turbo assembleru nejsme v názvech návěští nijak zvlášť omezováni. Ve vkládaném assembleru můžeme za název návěští použít posloupnost znaků začínající znakem @ (@1, @zacatek, @navesti). Jestliže používáme návěští, deklarované mimo vkládaný assembler (s pomocí LABEL), není přítomnost znaku @ nutná. Návěští s dvojtečkou uvedeme před instrukci, na kterou se odkazujeme. Při překladu je v místech odkazu na návěští jeho název nahrazen skutečnou adresou instrukce.

Nepodmíněný skok

Je to nepodmíněný skok na jiné místo programu. To musí být označené návěštím. Za instrukcí skoku je potom uveden jeho název.

  • JMP návěští - proveď skok programu na návěští (ve skutečnosti se jen změní obsah čítače instrukcí IP, případně CS při vzdáleném skoku) V programu potom nepodmíněný skok vypadá takto:
    @navesti: instrukce na kterou bude odkaz
              .
              .
              JMP @navesti

Jestliže skoky používáme, hrozí vždy nebezpečí, že se program zacykluje (a nikdy neskončí). Proto je důležité si vždy rozmyslet, za jakých okolností by k této kolizi mohlo dojít.

Podmíněný skok

Jedná se o skok podmíněný stavem jednoho nebo více, bitů registru příznaků F. Jen tímto způsobem je možné provádět v assembleru přímé větvení programu. Před instrukcí podmíněného skoku proto vždy provedeme instrukci, která použitý příznak nastaví. V případě, že není splněna podmínka skoku, pokračuje program dál, jako by se nic nedělo. Instrukce podmíněného skoku začínají vždy písmenkem J. Za ním je zkratka udávající na jakých bitech registru F je skok závislý.

  • JE návěští - skok na návěští při ZF = 1
  • JZ návěští - skok na návěští při ZF = 1
  • JNE návěští - skok na návěští při ZF = 0
  • JNZ návěští - skok na návěští při ZF = 0
  • JC návěští - skok na návěští při CF = 1
  • JNC návěští - skok na návěští při CF = 0
  • JS návěští - skok na návěští při SF = 1
  • JNS návěští - skok na návěští při SF = 0
  • JO návěští - skok na návěští při OF = 1
  • JNO návěští - skok na návěští při OF = 0
  • JP návěští - skok na návěští při PF = 1
  • JNP návěští - skok na návěští při PF = 0
  • JPE návěští - skok na návěští při PF = 1
  • JPO návěští - skok na návěští při PF = 0
  • JA návěští - skok na návěští při (CF = 0) AND (ZF = 0)
  • JNBE návěští - skok na návěští při (CF = 0) AND (ZF = 0)
  • JAE návěští - skok na návěští při CF = 0
  • JNB návěští - skok na návěští při CF = 0
  • JB návěští - skok na návěští při CF = 1
  • JNAE návěští - skok na návěští při CF = 1
  • JBE návěští - skok na návěští při (CF = 1) OR (ZF = 1)
  • JNA návěští - skok na návěští při (CF = 1) OR (ZF = 1)
  • JG návěští - skok na návěští při (ZF = 0) OR (SF = OF)
  • JNLE návěští - skok na návěští při (ZF = 0) OR (SF = OF)
  • JGE návěští - skok na návěští při SF = OF
  • JNL návěští - skok na návěští při SF = OF
  • JL návěští - skok na návěští při SF <> OF
  • JNGE návěští - skok na návěští při SF <> OF
  • JLE návěští - skok na návěští při (ZF = 1) OR (SF <> OF)
  • JNG návěští - skok na návěští při (ZF = 1) OR (SF <> OF)

Při hledání instrukce podmíněného skoku musíme myslet na to, za jakých okolností chceme skok vykonat. K tomu je také dobré si uvědomit:

  • A < B => A - B < 0 => SF = 1
  • A = B => A - B = 0 => ZF = 1
  • A > B => A - B > 0 => SF = 0

Rozdíl čísel v tomto případě provedeme nejlépe instrukcí CMP. Pro tvorbu cyklu můžeme použít jeden z registrů, který si pro krokovací proměnnou vyčleníme. Jednoduchý cyklus pak vytvoříme podmíněným skokem:

begin
 asm
  MOV CL, 10 {do registru CL dosaď 10, počet kroků}
 @nav:       {návěští, odsud umístíme opakovanou činnost}
  DEC CL     {odečti od CL číslo 1}
  JNZ @nav   {jestliže není nula skoč na návěští}
 end;
end.

Program opakuje skok dokud není v registru CL nulový výsledek.

Směr