Hoppa till innehållet
Hem

Maskinkod — grundläggande om instruktioner och exekverbar kod

Översikt av maskinkod: vad det är, hur instruktioner och operander fungerar, historik, användningsområden och skillnader mot assembler och högnivåspråk.

Ö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.

Bildgalleri

3 Bilder

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.

Att skriva maskinkod

Maskinkod kan skrivas på olika sätt:

  • Med hjälp av ett antal växlar. Detta genererar en sekvens av 1 och 0. Detta användes i början av datoriseringen. Sedan 1970-talet används det inte längre.
  • Använda en Hex-redigerare. Detta gör det möjligt att använda opkoder i stället för kommandonumret.
  • Användning av en assembler. Assemblerspråk är enklare än opkoder. Deras syntax är lättare att förstå än maskinspråk men svårare än högnivåspråk. Assemblern översätter källkoden till maskinkod på egen hand.
  • Genom att använda ett programmeringsspråk på hög nivå kan program som använder kod som är lättare att läsa och skriva. Dessa program översätts till maskinkod. Översättningen kan ske i många steg. Javaprogrammen optimeras först till bytekod. Därefter översätts den till maskinspråk när den används.

Typiska instruktioner i maskinkod

Det finns många olika typer av instruktioner som vanligtvis finns i en instruktionssats:

  • Aritmetiska operationer: Addition, subtraktion, multiplikation, division.
  • Logiska operationer: Konjunktion, disjunktion, negation.
  • Operationer som verkar på enskilda bitar: Skiftning av bitar till vänster eller höger.
  • Operationer som verkar på minnet: kopiering av ett värde från ett register till ett annat.
  • Operationer som jämför två värden: större än, mindre än, lika.
  • Operationer som kombinerar andra operationer: addera, jämföra och kopiera om det är lika med ett värde (som en operation), hoppa till en punkt i programmet om ett register är noll.
  • Operationer som påverkar programflödet: hoppa till en adress.
  • Operationer som konverterar datatyper: t.ex. konvertera ett 32-bitars heltal till ett 64-bitars heltal, konvertera ett flyttalvärde till ett heltal (genom att avkorta).

Många moderna processorer använder mikrokod för vissa av kommandona. Mer komplexa kommandon tenderar att använda den. Detta görs ofta med CISC-arkitekturer.

Instruktioner

Varje processor eller processorfamilj har sin egen instruktionsuppsättning. Instruktioner är mönster av bitar som motsvarar olika kommandon som kan ges till maskinen. Instruktionsuppsättningen är alltså specifik för en klass av processorer som (oftast) använder samma arkitektur.

Nyare processorkonstruktioner innehåller ofta alla instruktioner från en föregångare och kan lägga till ytterligare instruktioner. Ibland kommer en nyare konstruktion att avbryta eller ändra innebörden av en instruktionskod (vanligtvis för att den behövs för nya ändamål), vilket påverkar kodkompatibiliteten. Även nästan helt kompatibla processorer kan uppvisa något olika beteende för vissa instruktioner, men detta är sällan ett problem.

Systemen kan också skilja sig åt i andra detaljer, t.ex. i fråga om minnesarrangemang, operativsystem eller kringutrustning. Eftersom ett program normalt är beroende av sådana faktorer kommer olika system vanligtvis inte att köra samma maskinkod, även om samma typ av processor används.

De flesta instruktioner har ett eller flera opcode-fält. De anger den grundläggande instruktionstypen. Andra fält kan ange operandernas typ, adresseringsläge osv. Det kan också finnas särskilda instruktioner som ingår i själva opkoden. Dessa instruktioner kallas omedelbara instruktioner.

Processorkonstruktioner kan skilja sig åt på andra sätt. Olika instruktioner kan vara olika långa. De kan också ha samma längd. Att alla instruktioner har samma längd kan förenkla konstruktionen.

Exempel

MIPS-arkitekturen har instruktioner som är 32 bitar långa. Detta avsnitt innehåller exempel på kod. Den allmänna typen av instruktion finns i fältet op (operation). Det är de högsta 6 bitarna. Instruktioner av J-typ (jump) och I-typ (immediate) anges helt och hållet av op. Instruktioner av R-typ (register) innehåller fältet funct. Det bestämmer kodens exakta funktion. De fält som används i dessa typer är:

      6 5 5 5 5 5 5 6 bitar [ op | rs | rt | rd | rd |shamt| funct] R-typ [ op | rs | rt | address/immediate] I-typ [ op | måladress ] J-typ

rs, rt och rd anger registeroperanderna. shamt anger ett skiftbelopp. Adressfälten eller omedelbara fält innehåller en operand direkt.

Exempel: addera registren 1 och 2. Placera resultatet i register 6. Det kodas:

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

Ladda ett värde i register 8. Ta det från minnescellen 68 celler efter den plats som anges i register 3:

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

Hoppa till adressen 1024:

[ op | måladress ] 2 1024 decimal 000010 00000 00000 00000 00000 10000 000000 binärt

Relaterade sidor

  • Binärt siffersystem
  • Kvantdatorer
  • Instruktionsuppsättning
  • Dator med reducerad instruktionsuppsättning

Frågor och svar

F: Vad är maskinkod?

S: Maskinkod är ett datorprogram skrivet på maskinspråk som använder instruktionsuppsättningen för en viss datorarkitektur och är vanligtvis skrivet i binär form.

F: Vad är den lägsta nivån av programvara?

S: Maskinkod är den lägsta nivån av programvara.

F: Hur exekveras andra programmeringsspråk av datorer?

S: Andra programmeringsspråk översätts till maskinkod, som datorn kan exekvera.

F: Vad består en instruktion i maskinkod av?

S: En instruktion i maskinkod består av en opkod (operationskod) och en eller flera operander. Operanderna är vanligtvis minnesadresser eller data.

F: Vad är en instruktionsuppsättning?

S: En instruktionsuppsättning är en lista över de opkoder som finns tillgängliga för en dator.

F: Vad gör programbyggare med kod?

S: Programkonstruktörer omvandlar kod till ett annat språk eller maskinkod.

F: Vad är ett annat namn för maskinkod?

S: Maskinkod kallas ibland för inbyggd kod, vilket används när man talar om saker som bara fungerar på vissa datorer.

Relaterade artiklar

Författare

AlegsaOnline.com Maskinkod — grundläggande om instruktioner och exekverbar kod

URL: https://sv.alegsaonline.com/art/60338

Dela

Källor