Strojový kód

Strojový kód ( platformově orientovaný kód ), strojový jazyk  - systém příkazů (soubor operačních kódů) konkrétního počítače , který je interpretován přímo procesorem nebo firmwarem tohoto počítače. [jeden]

Počítačový program napsaný ve strojovém jazyce se skládá ze strojových instrukcí , z nichž každá je reprezentována ve strojovém kódu ve formě tzv. operační kód  - binární kód jedné operace z příkazového systému stroje. Pro usnadnění programování se místo numerických operačních kódů, kterým rozumí pouze procesor, obvykle používají jejich podmíněné abecední mnemotechnické pomůcky . Sada takových mnemotechnických pomůcek se spolu s některými dalšími funkcemi (například některá makra, směrnice ) nazývá jazyk symbolických instrukcí .

Každý model procesoru má svou vlastní instrukční sadu, i když v mnoha modelech se tyto instrukční sady silně překrývají. O procesoru A se říká, že je kompatibilní s procesorem B , pokud procesor A plně „rozumí“ strojovému kódu procesoru B. Pokud mají procesory A a B nějakou podmnožinu instrukcí, pro kterou jsou vzájemně kompatibilní, pak se říká, že mají stejnou "architekturu" (mají stejnou architekturu instrukční sady ).

Strojová instrukce

Každá strojová instrukce provádí specifickou akci, jako je operace s daty (například přidání nebo zkopírování strojového slova v registru nebo v paměti ) nebo skok na jinou část kódu (změna pořadí provádění; v tomto případě skok může být nepodmíněný nebo podmíněný , v závislosti na výsledcích předchozích pokynů). Jakýkoli spustitelný program se skládá ze sekvence takových operací atomového stroje.

Operace napsané jako jediná strojová instrukce lze rozdělit na „jednoduché“ ( elementární operace ) a „složité“. Většina moderních procesorů se navíc skládá ze samostatných „aktorů“ – výpočetních jednotek, které dokážou provádět pouze omezený soubor jednoduchých operací. Když je provedena další instrukce, speciální blok procesoru - dekodér - ji přeloží (dekóduje) do sekvence elementárních operací, kterým rozumí konkrétní výkonná zařízení.

Architektura instrukční sady procesoru určuje, jaké operace může vykonávat, a které strojové instrukce odpovídají jakým číselným operačním kódům (operačním kódům). Operační kódy mají konstantní délku (pro RISC -, MISC -architectures) a rozsah (pro CISC -architectures; například: pro x86 architekturu má příkaz délku 8 až 120 bitů).

Moderní superskalární procesory jsou schopné provádět více strojových instrukcí v jediném hodinovém cyklu .

Strojový kód jako programovací jazyk

Strojový kód lze považovat za primitivní programovací jazyk nebo za reprezentaci zkompilovaných nebo sestavených počítačových programů na nejnižší úrovni. Přestože je možné psát programy přímo ve strojovém kódu, dnes se to kvůli těžkopádnosti kódu a pracnosti ruční správy procesorových zdrojů provádí jen zřídka, s výjimkou situací, kdy je vyžadována extrémní optimalizace . Naprostá většina programů je proto napsána v jazycích vyšší úrovně a kompilátory přeloženy do strojového kódu . Strojový kód je někdy označován jako nativní kód (také nazývaný nativní kód ), když se mluví o částech jazyka nebo  knihoven specifických pro platformu . [2] 

Programy v interpretovaných jazycích (jako Basic nebo Python ) nejsou překládány do strojového kódu; místo toho jsou buď spouštěny přímo jazykovým interpretem , nebo přeloženy do pseudokódu ( bytecode ). Interpreti těchto jazyků (které samy o sobě lze považovat za procesory) jsou však obecně zastoupeny ve strojovém kódu.

Mikrokód

V některých počítačových architekturách je podpora strojového kódu poskytována ještě nižší úrovní programů nazývaných firmware . To umožňuje poskytnout jediné rozhraní strojového jazyka pro celou řadu nebo rodinu počítačů, které mohou mít mezi sebou značné strukturální rozdíly, a usnadňuje přenos programů ve strojovém kódu mezi různými modely počítačů. Příkladem tohoto přístupu je rodina počítačů IBM System/360 a jejich nástupci: navzdory různým sběrnicím od 8 do 64 bitů a vyšších sdílejí společnou architekturu na úrovni strojového jazyka.

Použití vrstvy mikrokódu k implementaci emulátoru umožňuje počítači reprezentovat architekturu úplně jiného počítače. V řadě System/360 to bylo použito k portování programů z dřívějších počítačů IBM do nové rodiny – například emulátor IBM 1401/1440/1460 na IBM S/360 model 40.

Absolutní a na pozici nezávislý kód

Absolutní kód ( anglicky  absolute code ) - programový kód vhodný pro přímé provádění procesorem [1] , tedy kód, který nevyžaduje dodatečné zpracování (například řešení vazeb mezi různými částmi kódu nebo vazbu na adresy v paměti, obvykle provádí zavaděč programu ) . Příklady absolutního kódu jsou spustitelné soubory ve formátu .COM a zavaděč OS umístěný v MBR . Často je absolutní kód chápán v užším smyslu jako kód závislý na poloze (tedy kód vázaný na konkrétní adresy paměti).

Kód nezávislý na pozici je program ,  který lze umístit do libovolné oblasti paměti, protože všechny odkazy na paměťové buňky v ní jsou relativní (například vzhledem k čítači programu ). Takový program lze kdykoli přesunout do jiné oblasti paměti, na rozdíl od přemístitelného programu , který, i když jej lze načíst do libovolné oblasti paměti, musí po načtení zůstat na stejném místě. [jeden]

Schopnost vytvářet kód nezávislý na pozici závisí na architektuře a instrukční sadě cílové platformy. Pokud například všechny instrukce skoku v sadě instrukcí musí specifikovat absolutní adresy, pak je téměř nemožné udělat kód, který vyžaduje skoky, nezávislý na pozici. V architektuře x86 je přímé adresování v datových instrukcích reprezentováno pouze absolutními adresami, ale protože datové adresy jsou považovány za relativní k registru segmentů , který lze kdykoli změnit, umožňuje to vytvořit kód nezávislý na poloze s vlastní pamětí. místa pro data. Kromě toho mohou být některá omezení instrukční sady zrušena pomocí samomodifikačního kódu nebo netriviálních sekvencí instrukcí.

Program "Ahoj, světe!"

Ahoj světe! » pro procesor x86 ( MS DOS , výstup pomocí přerušení BIOSu int 10h) je následující (v hexadecimálním zápisu ):

BB 11 01 B9 0D 00 B4 0E 8A 07 43 CD 10 E2 F9 CD 20 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21

Tento program funguje, když je umístěn na offset 100 16 . Jednotlivé pokyny jsou barevně zvýrazněny:

Stejný kód v příkazech assembleru :

XXXX:0100 mov bx, 0111h  ; vložte do bx offset HW řetězce XXXX:0103 mov cx, 000Dh  ; zadejte do cx délku HW řetězce XXXX:0106 mov ah, 0Eh  ; vložte ah funkci přerušení číslo 10h XXXX:0108 mov al, [bx]  ; vložte do al hodnotu paměťového místa, jehož adresa je v bx XXXX:010A včetně bx  ; přesunout na další bajt řetězce (přírůstek posunutý o 1) XXXX:010B int 10h  ; přerušit hovor 10h XXXX:010D smyčka 0108  ; snižte cx o 1 a pokud je výsledek≠0, přejděte na adresu 0108 XXXX:010F int 20h  ; přerušení 20h: ukončení programu XXXX:0111 HW db 'Ahoj, světe!'  ; řetězec, který se má vytisknout

Viz také

Poznámky

  1. 1 2 3 Explanatory Dictionary of Computing Systems = Dictionary of Computing / Ed. V. Illingworth a další: Per. z angličtiny. A. K. Belotsky a další; Ed. E. K. Maslovského. - M .: Mashinostroenie, 1990. - 560 s. - 70 000 (dalších) výtisků.  - ISBN 5-217-00617-X (SSSR), ISBN 0-19-853913-4 (VB).
  2. Kate Gregory. Spravovaný, nespravovaný, nativní: Co je to za kód? (28. dubna 2003). Získáno 27. března 2012. Archivováno z originálu 30. května 2012.