Strojový kód - Machine code

Monitor strojního jazyka v jednodeskovém počítači W65C816S , zobrazující demontáž kódu , stejně jako registry procesorů a výpisy paměti.

V počítačovém programování je strojový kód jakýkoli nízkoúrovňový programovací jazyk , skládající se z instrukcí strojového jazyka , který se používá k ovládání centrální procesorové jednotky (CPU) počítače. Každá instrukce způsobí, že CPU provede velmi specifický úkol, jako je zatížení, úložiště, skok nebo operace ALU ( aritmetic logic unit ) na jedné nebo více jednotkách dat v registrech nebo paměti CPU .

Strojový kód je striktně numerický jazyk, který je navržen tak, aby běžel co nejrychleji, a lze jej považovat za reprezentaci nejnižší úrovně kompilovaného nebo sestaveného počítačového programu nebo za primitivní a na hardwaru závislý programovací jazyk. I když je možné psát programy přímo do strojového kódu, ruční správa jednotlivých bitů a ruční výpočet číselných adres a konstant je únavné a náchylné k chybám. Z tohoto důvodu programy jsou velmi zřídka zapisují přímo do strojového kódu v moderních kontextech, ale může být provedeno za nízké úrovně ladění , program, záplatování (obzvláště když zdroj assembler není k dispozici) a montáž jazyk demontáž .

Většina dnešních praktických programů je napsána v jazycích vyšší úrovně nebo v jazyce sestavení. Zdrojový kód je poté přeložen do spustitelného strojového kódu pomocí obslužných programů, jako jsou kompilátory , assemblery a linkery , s důležitou výjimkou interpretovaných programů, které nejsou překládány do strojového kódu. Samotný tlumočník , na kterého lze pohlížet jako na vykonavatele nebo procesora provádějícího pokyny zdrojového kódu, se však obvykle skládá z přímo spustitelného strojového kódu (generovaného ze zdrojového kódu sestavení nebo jazyka vyšší úrovně).

Strojový kód je podle definice nejnižší úrovní programovacích detailů viditelných pro programátora, ale interně mnoho procesorů používá mikrokód nebo optimalizuje a transformuje instrukce strojového kódu do sekvencí mikrooperací . Toto není obecně považováno za strojový kód.

Instrukční sada

Každý procesor nebo rodina procesorů má svou vlastní sadu instrukcí . Pokyny jsou vzory bitů , číslic nebo znaků, které odpovídají strojovým příkazům. Sada instrukcí je tedy specifická pro třídu procesorů využívajících (většinou) stejnou architekturu. Návrhy následných nebo odvozených procesorů často obsahují pokyny předchůdce a mohou přidat nové další pokyny. Občas následný návrh přeruší nebo změní význam nějakého instrukčního kódu (obvykle proto, že je potřebný pro nové účely), což do určité míry ovlivní kompatibilitu kódu; i kompatibilní procesory mohou u některých pokynů vykazovat mírně odlišné chování, ale to je problém jen zřídka. Systémy se mohou lišit také v dalších detailech, jako je uspořádání paměti, operační systémy nebo periferní zařízení . Protože program obvykle spoléhá na takové faktory, různé systémy obvykle nespustí stejný strojový kód, i když je použit stejný typ procesoru.

Instrukční sada procesoru může mít všechny instrukce stejné délky, nebo může mít instrukce s proměnnou délkou. Organizace vzorů se liší podle konkrétní architektury a typu instrukce. Většina instrukcí má jedno nebo více polí operačního kódu, které určují základní typ instrukce (například aritmetika, logika, skok atd.), Operaci (například přidání nebo porovnání) a další pole, která mohou udávat typ operandu (s) ), adresovací režim ( režimy ), adresový offset (s) nebo index nebo samotná hodnota operandu (takové konstantní operandy obsažené v instrukci se nazývají okamžité ).

Ne všechny počítače nebo jednotlivé pokyny mají explicitní operandy. Akumulátor stroje má kombinovaný levý operand a výsledek implicitního akumulátoru u většiny aritmetických instrukcí. Jiné architektury (například 8086 a rodina x86) mají verze společných instrukcí pro akumulátory, přičemž delší instrukce považují akumulátor za jeden z obecných registrů. Zásobníkový počítač má většinu nebo všechny své operandů na implicitní zásobníku. Instrukce pro zvláštní účely také často postrádají explicitní operandy (CPUID v architektuře x86 zapisuje hodnoty například do čtyř implicitních cílových registrů). Toto rozlišení mezi explicitními a implicitními operandy je důležité v generátorech kódu, zejména v částech přidělení registru a sledování živého dosahu. Dobrý optimalizátor kódu může sledovat implicitní i explicitní operandy, které mohou umožnit častější konstantní šíření , konstantní skládání registrů (registr přiřazený jako výsledek konstantního výrazu uvolněný jeho nahrazením touto konstantou) a další vylepšení kódu.

Programy

Počítačový program je seznam instrukcí, které mohou být provedeny pomocí centrální procesorové jednotky (CPU). Spuštění programu se provádí proto, aby procesor, který jej provádí, vyřešil problém a dosáhl výsledku. Zatímco jednoduché procesory jsou schopné vykonávat instrukce jeden po druhém, superskalární procesory jsou schopné provádět mnoho instrukcí současně.

Tok programu může být ovlivněn speciálními „skokovými“ instrukcemi, které přenášejí provádění na jinou adresu (a tedy instrukci) než na další číselně sekvenční adresu. Zda dojde k těmto podmíněným skokům, závisí na podmínkách, jako je hodnota větší než, menší než nebo rovná se jiné hodnotě.

Montážní jazyky

Mnohem lidštější ztvárnění strojového jazyka, nazývané montážní jazyk , používá k označení instrukcí strojového kódu mnemotechnické kódy , místo toho, aby přímo používalo číselné hodnoty instrukcí, a používá symbolické názvy pro odkaz na umístění úložiště a někdy i na registry . Například na procesoru Zilog Z80 bude strojový kód 00000101, který způsobí, že CPU sníží B registr procesoru , reprezentován v jazyce sestavení jako DEC B.

Příklad

Architektura MIPS poskytuje konkrétní příklad pro strojový kód, jehož instrukce mají vždy 32 bitů. Obecný typ instrukce je dán polem op (operace), nejvyšších 6 bitů. Pokyny typu J (skok) a typu I (okamžité) jsou plně specifikovány op . R-type (registr) instrukce zahrnují další pole FUNCT určit přesný chod. Pole použitá v těchto typech jsou:

   6      5     5     5     5      6 bits
[  op  |  rs |  rt |  rd |shamt| funct]  R-type
[  op  |  rs |  rt | address/immediate]  I-type
[  op  |        target address        ]  J-type

rs , rt a rd označují operandy registru; shamt dává částku směny; a adresa nebo bezprostřední pole obsahují operand přímo.

Například přidání registrů 1 a 2 a umístění výsledku do registru 6 je kódováno:

[  op  |  rs |  rt |  rd |shamt| funct]
    0     1     2     6     0     32     decimal
 000000 00001 00010 00110 00000 100000   binary

Načtěte hodnotu do registru 8, odebranou z buňky buňky paměti 68 za umístěním uvedeným v registru 3:

[  op  |  rs |  rt | address/immediate]
   35     3     8           68           decimal
 100011 00011 01000 00000 00001 000100   binary

Skákání na adresu 1024:

[  op  |        target address        ]
    2                 1024               decimal
 000010 00000 00000 00000 10000 000000   binary

Vztah k mikrokódu

V některých počítačových architekturách je strojový kód implementován ještě zásadnější základní vrstvou nazývanou mikrokód , poskytující společné rozhraní strojového jazyka napříč řadou nebo rodinou různých modelů počítačů s velmi odlišnými podkladovými toky dat . To se provádí za účelem usnadnění přenosu programů strojového jazyka mezi různé modely. Příkladem tohoto použití je rodina počítačů IBM System/360 a jejich nástupci. S šířkou cesty toku dat od 8 bitů do 64 bitů a dále však přesto představují společnou architekturu na úrovni strojového jazyka na celém řádku.

Použití mikrokódu k implementaci emulátoru umožňuje počítači prezentovat architekturu zcela jiného počítače. Řada System/360 toho umožňovala portovat programy z dřívějších počítačů IBM do nové rodiny počítačů, např. Emulátoru IBM 1401/1440/1460 na modelu IBM S/360 model 40.

Vztah k bytecode

Strojový kód se obecně liší od bajtkódu (také známého jako p-kód), který je buď vykonán tlumočníkem, nebo sám zkompilován do strojového kódu pro rychlejší (přímé) provedení. Výjimkou je případ, kdy je procesor navržen tak, aby jako strojový kód používal konkrétní bytecode přímo, jako je tomu v případě procesorů Java .

Strojový kód a kód sestavy se někdy nazývá nativní kód, když se odkazuje na části jazykových funkcí nebo knihoven závislé na platformě.

Ukládání do paměti

Harvardská architektura je architektura počítače s fyzicky oddělené skladování a signálních drah pro kód (návod) a dat . Dnes většina procesorů implementuje takové oddělené signálové cesty z důvodů výkonu, ale implementuje modifikovanou harvardskou architekturu , takže mohou podporovat úlohy, jako je načítání spustitelného programu z diskového úložiště jako data a jeho následné provádění. Harvardská architektura je v kontrastu s architekturou Von Neumann , kde jsou data a kód uloženy ve stejné paměti, kterou čte procesor, což umožňuje počítači provádět příkazy.

Z hlediska procesu je kódový prostor částí jeho adresního prostoru, kde je uložen prováděcí kód. Ve víceúlohových systémech to zahrnuje segment kódu programu a obvykle sdílené knihovny . V multi-threading prostředí, různé závity jednoho procesního podíl kódového prostoru spolu s datového prostoru, což snižuje režii na přepínání kontextu výrazně ve srovnání s přepínání procesu.

Čitelnost pro lidi

Pamela Samuelson napsala, že strojový kód je tak nečitelný, že americký úřad pro autorská práva nedokáže určit, zda je konkrétní kódovaný program originálním autorským dílem; americký úřad pro autorská práva však umožňuje registraci počítačových programů na základě autorských práv a strojový kód programu lze někdy dekompilovat , aby bylo jeho fungování pro lidi snadněji srozumitelné. Na výstupu dekompilátoru nebo disassembleru však budou chybět komentáře a symbolické odkazy, takže i když výstup může být čitelnější než kód objektu, bude stále obtížnější než původní zdrojový kód. Tento problém neexistuje pro formáty objektového kódu, jako je SQUOZE , kde je zdrojový kód součástí souboru.

Profesor kognitivní vědy Douglas Hofstadter srovnal strojový kód s genetickým kódem a řekl, že „Pohled na program napsaný ve strojovém jazyce je vágně srovnatelný s pohledem na molekulu DNA atom po atomu“.

Viz také

Poznámky a reference

Další čtení