Strojna koda je računalniški program, napisan v strojnem jeziku. Uporablja nabor ukazov določene računalniške arhitekture. Običajno je zapisana v binarni obliki. Strojna koda je najnižja raven programske opreme. Drugi programski jeziki so prevedeni v strojno kodo, da jih računalnik lahko izvaja.

Navodilo pove procesu, katero operacijo naj izvede. Vsako navodilo je sestavljeno iz opcode (koda operacije) in operandov. Operandi so običajno pomnilniški naslovi ali podatki. Nabor navodil je seznam opcijskih kod, ki so na voljo v računalniku. Strojna koda je tisto, v kar se sestavljena koda in drugi programski jeziki predelajo ali interpretirajo.

Ustvarjalci programov spreminjajo kodo v drug jezik ali strojno kodo. Strojna koda se včasih imenuje izvirna koda. To se uporablja, ko govorimo o stvareh, ki delujejo le na nekaterih računalnikih.

Kako deluje strojna koda

Procesor izvaja strojno kodo z zanko, imenovano fetch-decode-execute (pridobi-dekodiraj-izvedi). Najprej procesor prebere (fetch) naslednje navodilo iz pomnilnika, nato razčleni (decode) opcode in operande ter na koncu izvede (execute) zahtevano operacijo (npr. aritmetično operacijo, prenos podatkov ali skok v drugo lokacijo). Za izvajanje so ključni elementi CPU: aritmetično-logična enota (ALU), registri in upravljalna enota.

Struktura navodil

Navodila so lahko različnih oblik in dolžin. Nekatera so kratka in imajo fiksno dolžino (pogosto pri RISC arhitekturah), druga pa so spremenljive dolžine (kot pri nekaterih CISC arhitekturah). Pogoste komponente navodila so:

  • Opcode: določa vrsto operacije.
  • Registrski operandi: referenca na procesorske registre.
  • Spominski operandi: naslovi v glavnem pomnilniku ali pomnilniški pomik.
  • Imediate vrednosti: neposredni podatki, vgrajeni v navodilo.
  • Flaški in pogojne kode: določajo vedenje skokov in pogojev.

Nadzor naslavljanja in načini dostopa

Navodila uporabljajo različne načine dostopa do podatkov (adresiranja): neposredno (immediate), neposredno naslovljeno, indeksno, z registrskim pomikom ali prek kazalcev. Ti načini določajo, kako se izračuna lokacija podatkov in kako jih procesor prebere ali zapiše.

Predstavitev v pomnilniku

V pomnilniku je strojna koda običajno zapisana kot zaporedje bajtov. Človek jo pogosto prikazuje v heksadecimalni obliki (npr. 0xB8 0x01 0x00 ...), ker je to berljivejše od dolge vrstice ničel in enic. Pomembna lastnost je endianness (big-endian ali little-endian), ki določa vrstni red bajtov pri večbajtnih vrednostih.

Arhitekture in prenosljivost

Strojna koda ni prenosljiva med različnimi računalniškimi arhitekturami — binarna datoteka, prevedena za eno arhitekturo (npr. x86), na drugi arhitekturi (npr. ARM) ne bo delovala. Zato obstajajo različni nabori ukazov (ISA), ki opredeljujejo, katera navodila in formati so podprti. Nekatere razlike med ISA vključujejo število in vlogo registrov, dolžino ukazov ter podporo za posebne operacije (vektorji, plavajoča vejica itd.).

Kako nastane strojna koda

Strojna koda nastane z uporabo prevajalnikov (compiler), asemblerjev (assembler) ali orodij za povezovanje (linker). Visokonivojski jeziki, kot so C ali Java (po prevodu v izvorno kodo za stroj ali v bytecode za VM), se s prevajalnikom pretvorijo v strojno kodo ali v vmesne formate, ki jih izvrši navidezna strojna oprema. Asembler prevaja sestavljeno (assembly) kodo neposredno v strojno kodo.

Orodja in analiza

Za delo s strojno kodo se uporabljajo orodja, kot so:

  • Asembler/prekvalifikatorji — prevajajo asembler v binarno obliko.
  • Disassemblerji — pretvarjajo binarno kodo nazaj v asembler za analizo.
  • Debuggerji in emulatorji — omogočajo izvajanje, korakovanje in testiranje navodil brez dejanskega strojnega okolja.

Uporabe in pomisleki

Strojna koda se uporablja v operacijskih sistemih, gonilnikih, vgrajenih sistemih in v firmware-u, kjer je potrebna visoka učinkovitost in neposreden nadzor nad strojno opremo. Hkrati je zaradi neposrednega dostopa do strojnih virov občutljiva na napake in varnostne ranljivosti (npr. prelivanje medpomnilnika, izvajanje nezaželenih skokov). Zaradi tega so pomembne tehnike, kot so zaščita pomnilnika, preverjanje dovoljenj in varnost pri nalaganju izvršljivih datotek.

Zaključek

Strojna koda predstavlja najnižjo raven programske izražnosti, v kateri so programi neposredno razumljivi in izvršljivi s strani procesorja. Razumevanje njene strukture, oblikovanja navodil in načina izvedbe omogoča boljše optimiziranje programov, odpravljanje napak in zagotavljanje varnosti v sodobnih računalniških sistemih.