Översikt

Maskinkod är den representation av ett program som en dator direkt kan läsa och utföra. Den består av instruktioner definierade av en instruktionsuppsättning och är knuten till en viss datorarkitektur. I praktiken lagras maskinkod ofta i ett binärt format — sekvenser av bitar eller bytes — och betraktas som den lägsta nivån inom programvara. All kod som skrivs i högnivåspråk måste i någon mening översättas till maskinkod innan processorn kan exekvera den, antingen genom kompilering eller tolkning.

Struktur och komponenter

Varje maskininstruktion innehåller normalt en operationskod (opcode) och noll, en eller flera operander. Termen opcode anger vilken operation som ska utföras, medan operander anger vilka data som berörs. Operander kan vara omedelbara värden, registeridentifierare eller minnesadresser. Hur en instruktion kodas — längd, bitfält och adresseringslägen — bestäms av den aktuella instruktionsuppsättningen för en given arkitektur.

Typer av instruktioner

  • Datamanipulation: flytta, lägga till, subtrahera.
  • Kontrollflöde: hopp, villkorliga hopp, anrop och retur.
  • Last/lagra: läsa från och skriva till minne.
  • System- och maskinvarufunktioner: avbrott, I/O-instruktioner.

Beskrivningen av vilka opkoder som finns och hur de används utgör en dators instruktionsuppsättning, vilken är specifik för varje modell av dator. Människor skriver ofta läsbar assemblerkod som sedan översätts till maskinkod; assemblerkoden kallas då assemblerkod, medan källkod i andra språk som C eller Rust är exempel på programmeringsspråk.

Historik och utveckling

Tidiga datorer programmerades direkt i maskinkod eller med hjälp av enkla assemblerverktyg. Med tiden utvecklades kompilerare och andra verktyg som automatiskt översätter högnivåkod till maskinkod. Processen att översätta eller producera maskinkod beskrivs ofta som att koden kompileras eller länkas, och de verktyg som utför översättningen kallas ibland programkonstruktörer eller verktygskedjor. Arkitekturens komplexitet har ökat, från enkla fasta instruktioner till moderna kompletta instruktionsuppsättningar med många adresserings lägen och optimeringar.

Användningsområden och betydelse

Maskinkod används där direkt kontroll över hårdvaran eller maximal prestanda krävs. Vanliga användningsområden är:

  • Operativsystemets kärna och drivrutiner som behöver direkt hårdvaruåtkomst.
  • Inbyggda system och mikrokontroller där resurser är begränsade.
  • Prestandakritiska delar av program, ibland skrivet i assembler och sedan integrerat som maskinkod.
  • Analys av exekverbara filer och säkerhetsgranskning vid reverse engineering.

Särskilda aspekter och skillnader

Maskinkod är icke-portabel: samma binärfil fungerar vanligtvis bara på instruktioner och arkitekturer den är avsedd för. Därför talar man ibland om "inhemsk kod" när kod är bundet till en viss hårdvara. För att underlätta portering används oftast högnivåspråk och virtualiseringslager, men slutligen måste koden kartläggas till den underliggande instruktionsuppsättningen så att processorn kan exekvera den.

För vidare läsning om specifika instruktionsuppsättningar, assembler och kompileringsprinciper, se introduktioner och tekniska manualer via följande länkar: instruktionsuppsättning, arkitektur, binärt format, programvara, opcode, operander, minnesadresser, dator, assemblerkod, programmeringsspråk, kompileras och programkonstruktörer.