Strojový kód: Porovnání verzí

Smazaný obsah Přidaný obsah
m Editace uživatele 91.227.7.99 (diskuse) vráceny do předchozího stavu, jehož autorem je Paul E
M-sche (diskuse | příspěvky)
m Typografie
Řádek 3:
Instrukce jsou uloženy v [[operační paměť|paměti]] jako sekvence [[bit]]ů, tedy jako čísla. Nejčastěji se instrukce skládá z bitového pole určující kód instrukce a bitových polí popisující operandy. Instrukce může mít několik operandů (třeba i čtyři operandy), existují ovšem i instrukce bez operandů (nebo s operandy implicitními, tedy vždy stejnými, bez zvláštního bitového pole v kódu instrukce).
 
Pro převod instrukcí ze symbolického zápisu do strojového kódu se používá sada jednoduchých překladových nástrojů, zpravidla jde o [[assembler]] - program pro překlad kódu modulů a [[linker]] - program pro spojování jednotlivých modulů dohromady. Protože instrukční sada se u různých typů procesorů může lišit, je třeba použít pro každý typ procesoru odpovídající assembler a linker.
 
== Instrukční pole ==
Řádek 13:
=== Operandy ===
Operand instrukce je jejím parametrem. Jestliže operační kód říká ''co'' se bude provádět, operandy definují ''s čím'', s jakými daty. V bitových polích vyhrazených pro operandy (neboli parametry) instrukce může být zakódována:
* konstanta - jako operand se použije přímo hodnota bitového pole
* registr - číslo v bitovém poli určuje registr
* adresa určená konstantou - operandem je hodnota na adrese určené bitovým polem
* adresa určená registrem - operandem je hodnota na adrese obsažené v registru určeném bitovým polem
* adresa určená kombinací registrů a konstant - v bitovém poli může být dohodnutým způsobem zakódován i složitější adresový výraz V instrukční sadě [[IA-32|i386]] lze například adresu zadat i jako součet bázového registru, indexovaného registru vynásobeného jednou z konstant 1,2,4 a konstanty.
 
=== Šířka instrukčního pole ===
Řádek 35:
 
=== Instrukční sady typu CISC ===
Zkratka [[CISC]] - complex instruction set computer - znamená v doslovném překladu „počítač s komplexní instrukční sadou“. Instrukční sada typu CISC má mnoho typů instrukcí, délka instrukčního slova může být proměnná. Nejstarší architektury mikroprocesorů, jako například [[Intel 8080]], [[Zilog Z80]], [[Intel 8086]] nebo [[Motorola 68000]] jsou založeny na tzv. [[mikrokód]]u. To znamená, že každá instrukce se skládala z několika kroků tzv. mikroprogramu. Mikroprogramy umožňují snadno vytvořit mnoho různých typů instrukcí, takže výsledná hustota kódu je velice dobrá, avšak za cenu výrazného zpomalení procesoru, daného nutností provést pro každou instrukci několik kroků mikrokódu.
 
=== Instrukční sady typu RISC ===
Zkratka [[RISC]] - reduced instruction set computer znamená „počítač s redukovanou instrukční sadou“. Základní myšlenkou je snížení počtu instrukcí, aby mohla být každá instrukce provedena pokud možno v jediném taktu procesoru. Díky zjednodušení instrukčního dekodéru je pak možné rozšířit funkčnost instrukcí a zmenšit počet tranzistorů v procesoru. Typů instrukcí je relativně málo a jsou jednoduché na dekódování. Specializované instrukce běžné v sadách typu CISC je možné nahradit jednou nebo několika univerzálními instrukcemi sady RISC, i tak je díky nepřítomnosti mikrokódu rychlost procesoru vyšší. Nevýhodou proti sadám CISC je nižší hustota kódu, a tedy vyšší spotřeba paměti programu pro dosažení stejné funkčnosti.
 
=== Procesory s RISCovým jádrem ===
Řádek 65:
Příkladem instrukce ze sady [[IA-32|i386]] může být např. instrukce <code>int 21h</code>. Int znamená [[Přerušení|interrupt]] a 21h (číslo 21 v šestnáctkové soustavě) je operand zadaný konstantou. Strojový kód této instrukce v [[operační paměť|paměti]] je 11001101 00100001 (posloupnost dvou [[byte|bytů]], které můžeme zapsat šestnáctkově jako 0CDh 21h).
 
Příkladem nejdelší instrukce i386 (ve skutečnosti tak dlouhé, že nefunguje - prefix F0 (lock) musíte odstranit) je
F0 6626 67C7 845E 7856 3412 F0DE BC9A - lock mov dword [es:esi+ebx*2+0x12345678],0x9abcdef0.
Nejkratší instrukcí je třeba <code>nop</code> (nic nedělej) s kódem 0x90. Ve skutečnosti se ale jedná o instrukci <code>xchg ax,ax</code> (vyměň registr ax s registrem ax, tedy skutečně instrukce bez efektu), rozdělitelnou na kód (10010) a registrový operand (000 znamená ax, resp. eax v 32bitovém módu).