Mašīnkods ir mašīnvalodā rakstīta datorprogramma. Tā izmanto konkrētas datora arhitektūras instrukciju kopumu. To parasti raksta binārajā rakstībā. Mašīnkods ir zemākais programmatūras līmenis. Citas programmēšanas valodas tiek tulkotas mašīnkodā, lai dators varētu tās izpildīt.

Instrukcija norāda procesam, kāda darbība jāveic. Katru instrukciju veido opkods (operācijas kods) un operands(-i). Operandi parasti ir atmiņas adreses vai dati. Instrukciju kopums ir datoram pieejamo opkodu saraksts. Mašīnkods ir tas, uz ko kompilē asembleru kodu un citas programmēšanas valodas vai kā to interpretē.

Programmu veidotāji pārvērš kodu citā valodā vai mašīnkodā. Mašīnkods dažkārt tiek saukts par vietējo kodu. To lieto, runājot par lietām, kas darbojas tikai dažos datoros.

Struktūra un kodēšana

Mašīnkodā katra instrukcija parasti sastāv no divām pamatelementu grupām:

  • Opkods — norāda, kāda operācija jāveic (piem., saskaitīt, pārvietot datus, veikt šūnu salīdzināšanu).
  • Operandi — nosaka, uz kuriem datiem vai reģistriem opkods darbojas (piem., reģistru nosaukumi, atmiņas adreses vai tieši norādīti skaitļi — immediate).
Opkodi un operandi tiek kodēti bitu secībā (bieži attēloti heksadecimālā vai binārā formā). Instrukcijas formāts var būt fiksēta garuma (piem., 32 biti) vai mainīga (dažas arhitektūras, piemēram, dažas x86 instrukcijas, var ietvert dažādas garuma kombinācijas). Papildus lauki var iekļaut adresēšanas veidus, reģistra indeksus, karodziņu bitus un citus papildu informācijas laukus.

Adrese, reģistri un adresēšanas režīmi

Operandi var norādīt:

  • reģistrus (ātra piekļuve procesora iekšējam atmiņas veidam),
  • atmiņas adreses (tieši vai netieši ar norādītājiem),
  • immediate vērtības (skaitļi, kas iekodēti tieši instrukcijā).
Atkarībā no instrukciju kopuma ir pieejami dažādi adresēšanas režīmi — tie nosaka, kā operandus interpretēt (tieša adresēšana, netieša, ar bāzes + offsets, indeksēta u.c.).

Piemēri (vienkāršots)

Lai skaidrāk parādītu, kā mašīnkods izskatās, zemāk ir vienkāršots un izdomāts 8 bitu procesora piemērs:

  • Opkods 0x01 = LOAD (ielādēt no atmiņas), seko viens baits ar atmiņas adresi. Mašīnkods: 01 10 (hex) — komanda: LOAD adresē 0x10.
  • Opkods 0x02 = ADD (saskaitīt ar reģistru A), seko viens baits ar immediate vērtību. Mašīnkods: 02 05 — komanda: ADD A, #5.
  • Sastapt binārā izskatā: 01 00010000 (pirmais baits 00000001 = 0x01, otrais 00010000 = 0x10).

Šis ir mācību piemērs; reālās arhitektūras (x86, ARM, RISC‑V u.c.) izmanto sarežģītākus un precīzi definētus kodēšanas noteikumus, adresēšanas veidus un paplašinājumus.

Praktiski aspekti un lietojums

Dažas būtiskas lietas, ko svarīgi zināt par mašīnkodu:

  • Portabilitāte. Mašīnkods ir cieši saistīts ar konkrētu datora arhitektūru (ISA). Programma, kas salikta par mašīnkodu vienai arhitektūrai, parasti nedarbosies citā bez pārsalidošanas vai emulācijas.
  • Assembleri un kompilatori. Cilvēkiem saprotamu, augsta līmeņa valodu vai asembleru kodu pārvērš mašīnkodā. Asemblera gadījumā viens mnemonisks ieraksts bieži atbilst vienai instrukcijai/mašīnkoda baitam.
  • Interpretācija. Dažas sistēmas izmanto interpretētājus (piem., virtuālās mašīnas) — tad nav tiešas mašīnkoda izpildes uz aparatūras, bet interpretators pats izpilda komandas.
  • Debug un reverse engineering. Rīki kā disassembleri (piem., objdump) pārvērš mašīnkodu atpakaļ uz mnemoniskiem vaicājumiem, ļaujot izsekot un labot programmas darbību.
  • Drošība. Malware un ekspluatācijas bieži izmanto tiešu mašīnkoda manipulāciju. Tāpat zemo līmeni var izmantot optimizācijām vai aparatūras tuvām operācijām (firmware, draiveri).

Rīki un terminoloģija

Lai strādātu ar mašīnkodu, parasti izmanto:

  • asemblerus (samapina mnemonikas uz mašīnkodu),
  • kompilatorus (augsta līmeņa kodu pārvērš mašīnkodā),
  • disassemblerus un dekompilatorus (pārveido mašīnkodu uz cilvēkam lasāmu formu),
  • debuggerus un hexdump rīkus (analizē un rediģē mašīnkoda baitus),
  • ISA specifikācijas un instrukciju tabulas — oficiālie dokumenti, kas apraksta opkodu nozīmi un kodēšanu konkrētai arhitektūrai.

Kopsavilkums

Mašīnkods ir tiešā, binārā instrukciju forma, ko izpilda procesors un kas ir vistuvāk aparatūrai. Tas sastāv no opkodiem un operandiem, kuru konkrēta izskata apraksts atkarīgs no datora arhitektūras. Lai strādātu ar mašīnkodu, izmanto specializētus rīkus, un bieži augsta līmeņa izstrāde prasa kompilēšanu vai asemblera izmantošanu, lai pārvērstu cilvēkam saprotamu kodu par mašīnai izpildāmu formu.