Strojová instrukce: Porovnání verzí

Smazaný obsah Přidaný obsah
m drobné úpravy
přepsání článku
Řádek 1:
'''Instrukce''' je v počítačové terminologii specifikace jednoduchéelementární akce, kterou(operace) prováděné provést[[počítač]]em pomocí [[procesor]].u, Instrukceje jsouzákladní známékódovou předevšímjednotkou vepři tvaruvykonávání lidempočítačových přívětivějším,programů. aKaždý totyp tak,procesoru jak se zapisují při programování vvlastní [[Assemblerinstrukční sada|assembleruinstrukční sadu]], kterou je schopen přímo vykonávat.
 
== Zápis instrukce ==
Binární tvar instrukce se skládá většinou na začátku z instrukčního kódu (nazývaného častěji operační kód, anglicky „opcode“), který říká, co je to za instrukci, a parametrů (operandů), které mohou být:
Funkce instrukce se pojmenovává tzv. ''mnemonikou''. Za mnemonikou mohou (ale nemusí) následovat ''operandy'', neboli parametry dané instukce.
* do instrukce zakódované konstanty
* označení registrů, odkud vzít hodnotu, případně kam zapsat
* adresa paměti, odkud načíst hodnotu, případně kam zapsat
* adresa paměti, kam má skočit další provádění programu
 
=== Mnemonika ===
Vykonání istrukce:
Mnemoniky se většinou skládají z několika písmen zkratkovitě v angličtině naznačujících funkci dané instrukce. Například mnemonika SUB (z anglického SUBtract - odečti) se může použít pro operaci odečítání, mnemonika CMP (CoMPare) může být použita pro označení instrukce pro porovnání dvou čísel. Pro zápis ani pro implementaci instrukcí neexistují jednotná pravidla, každá rodina procesorů (nebo také architektura) má vlastní instrukční sadu s vlastními mnemonikami.
 
=== Operand ===
Instrukce je vykonávána postupně v těchto krocích:
Jestliže mnemonika označuje ''co'' daná instrukce dělá, její operandy určují s ''čím''.
Jinými slovy, operand určuje zdrojová nebo cílová data, nad kterými daná instrukce pracuje. Operand bývá buď konstantou, nebo adresou v některém z paměťových prostorů počítače. Typicky jsou to adresový prostor [[registr]]ů a operační paměti.
 
Adresa může určena buď přímo (tzv. přímé adresování) - jako konstanta určující index buňky v operační paměi počítače . Druhou základní možností je nepřímé adresování, kdy je operandem registr jehož obsah je interpretován jako index buňky v operační paměti počítače.
*1. Přesun na další instrukci
*2. Načtení instrukce do CPU - načte se kód instrukce z paměti
*3. Dekódování instrukce - zde se zjistí, o jakou instrukci se jedná
*4. Výpočet adres operandů
*5. Přesun operandů do CPU
*6. Vlastní vykonání operace
*7. Uložení výsledku
 
=== Příklady instrukcí ===
Poté se opět opakuje 1. krok. Tento postup je obecný a netýká se tedy konkrétního procesoru.
Následující jsou uvedeny v instrukčním kódu procesoru Síemens SAB 80C166. Z hlediska výkladu je vhodný, protože jde o jednoduchý 16 bitový procesor s poměrně čistou, nijak extrémní architekturou.
 
* <TT>add r0, r2; </TT>sčítání - přičte do registru r0 hodnotu uloženou v registru r2
* <TT>addc r1, r3; </TT>sčítání s přenosem - přičte do registru r0 hodnotu registru r1 a příznaku přenosu C
* <TT>mov 1234h, r0; </TT>přesun - uloží do paměti na adresu 1234h hodnotu z registru r0
* <TT>mov 1236h, r1; </TT>přesun - uloží do paměti na adresu 1236h hodnotu z registru r1
* <TT>mov [r7], r0; </TT>přesun - uloží na adresu určenou registrem r7 hodnotu z registru r0
* <TT>cmp r4, r5; </TT>porovnání - porovná hodnoty registrů r4 a r5
* <TT>jmpr cc_UGT, 8100h; </TT>podmíněný skok - pokud byla hodnota registru r4 vyšší, pokračuje program na adrese 8100h
 
Instrukce se dělí podle svého určení na přesunové, aritmeticko-logické a řídící instrukce. Výrobci většinou používají mnohem jemnější rozdělení (např. přesuny, aritmetické, logické, rotace, násobení a dělení, skoky, zásobníkové, systémové instrukce).
 
U některých architektur není bohužel situace tak jasná. Například přesunová instrukce, která změní hodnotu v systémovém registru procesoru de-facto přebírá funkci systémové instrukce.
 
 
== Přesunové instrukce ==
Přesunové slouží ke kopírování dat v paměti. Tyto instrukce mají typicky mnemoniku MOV (z angl. move - přesun), případně LD nebo ST (load, store). Prakticky vždy mají dva operandy - zdrojový a cílový, kdy hodnota uložená ve zdrojovém operandu je uložena do dílového operandu.
 
== Aritmeticko-logické instrukce ==
Aritmeticko-logické instrukce slouží k vykonávání aritmetických nebo logických operací. V podstatě jde o to, že se zdrojovými operandy se provede určitá matematická operace, jejíž výsledek je uložen do cílového operandu. Velmi častý je případ, kdy jeden ze zdrojových operandů slouží současně jako cílový. To znamená, že např. instrukce add r0, r1 nejprve sečte hodnoty registrů r0 a r1, přičemž výsledek uloží do registru r0.
 
Typickými funkcemi aritmetickou-logických instrukcí jsou [[sčítání]] (ADD), [[odečítání]] (SUB), porovnávání (CMP), bitové [[logický součet|logické součty]] (OR) a [[logický součin|logické součiny]] (AND), bitové posuny a rotace.
 
Aritmetické nebo logické nemusí být vždy dvouoperandové, instrukce realizující např. absolutní hodnotu, násobení mínus jedničkou, nebo dvojkový doplněk mají pouze jeden operand.
 
Podle možností daného procesoru se liší šířka operandů (8/16/32 [[bit]]ů) a jejich typ. Některé procesory (např. [[PIC]]) mají pouze instrukce pro jednoduché operace s malými celými čísly (viz. [[BYTE]]), jiné mohou přímo pracovat s čísly v plovoucí řádové čárce (např. dle standardu [[IEEE752]]).
 
== Instrukce a příznakové registry ==
Záměrným vedlejším efekterm provedení instrukce obvykle bývá určité nastavení příznakových bitů v procesoru. Způsob nastavování příznaků bývá obvykle pro určitou skupinu instrukcí stejný. Zvláštní funkci z tohoto hlediska zastávají instrukce pro porovnávání, protože nemění hodnotu svých operandů, ale pouze nastavují příznakové bity.
 
Téměř vždy jsou přítomny příznakové bity
* ''N'' - negative - nastavuje se, když je výsledkem operace záporné číslo
* ''Z'' - zero - nastavuje se, když je výsledkem operace nula
* ''C'' nebo ''CY'' - carry - nastavuje se, když došlo při operaci k přenosu
* ''V'' nebo ''OV'' - overflow - nastavuje se, pokud došlo při operaci k přeteční
 
Probírat přesný význam příznakových bitů je nad rámec tohoto článku, různé procesory mohou implementovat více, ale jen výjimečně méně přiznakových bitů (flags). Přestože by to bylo velmi neobvyklé, základní příznakové bity by bylo možné definovat i odlišně (např. Intel 8080 neimplementoval příznak přetečení).
 
 
== Řídící instrukce ==
 
Tyto instrukce mění buď tok programu, nebo způsob, jakým procesor funguje. Základní řídící instrukcí je instrukce skoku (typicky má ''mnemoniku'' JMP), která říká, že vykonávání programu nepokračuje následující instrukcí, ale instrukcí která je uložena na adrese definované operandem instrukce JMP.
 
Podobnou funkci má instrukce podmíněného skoku, která se používá v kombinaci s instrukcemi nastavujícími příznakové bity k větvení programu. Ke skoku dojde pouze za předpokladu, že jsou určitým způsobem nastaveny příznakové bity procesoru. Následující instrukce podmíněného skoku (např. JMPR CC_NZ, 1234h - skoč, když není nastaven příznak Z - zero) může například "přehodit výhybku programu", pokud výsledkem kontrolního součtu nebyla nula.
 
Opakovaně využívané sekvence kódu je možné vyvolat pomocí instrukce volání podprogramu (typicky "CALL"), konec podprogramu označuje instrukce návratu z podprogramu (typicky "RET" nebo "RETURN").
 
Kromě toho mohou některé instrukce měnit způsob chodu procesoru, extrémním případem mohou být procesor ARM, který může být přepínán mezi dvěma různými soubory instrukcí - mezi "ARM" módem a "thumb" módem. Přičemž instrukční soubor ARM je optimalizovaný na rychlost, zatímco instrukční soubor "thumb" je optimalizovaný na velikost kódu.
 
 
== Kódování instrukcí ==
Aby mohly být instrukce vykonávány procesorem, je nutno je uložit do polovodičové [[paměť|paměti]], jako sekvence několikaciferných dvojkových čísel. Tato sekvence se nazývá [[strojový kód]]. Výrobce procesoru proto pro každou instrukci definuje, jakým způsobem má být zakódována do paměti počítače.
 
Abychom si to ozřejmili, výrobce procesoru může například stanovit, že každá instrukce je zakódována pomocí 16 bitů (neboli dvojkových cifer). Přitom do prvních šesti bitů se zakóduje mnemonika instrukce (šestibitové číslo nám dovolí implementovat 64 typů instrukcí - ''mnemonik''), do druhých pěti bitů zakódujeme první operand, do posledních pěti bitů druhý operand. Ve skutečnosti bývá kódování instrukcí mnohem složitější, avšak princip je stejný.
 
 
{{Počítačový pahýl}}
 
[[bg:Машинна инструкция]]