Machinetaal

Machinecode is een computerprogramma geschreven in machinetaal. Het maakt gebruik van de instructieset van een bepaalde computerarchitectuur. Het is gewoonlijk binair geschreven. Machinecode is het laagste niveau van software. Andere programmeertalen worden vertaald naar machinecode zodat de computer ze kan uitvoeren.

Een instructie vertelt het proces welke bewerking het moet uitvoeren. Elke instructie bestaat uit een opcode (operatiecode) en operand(s). De operanden zijn gewoonlijk geheugenadressen of gegevens. Een instructieset is een lijst van de opcodes die voor een computer beschikbaar zijn. Machinecode is datgene waarnaar assemblagecode en andere programmeertalen worden gecompileerd of geïnterpreteerd.

Programmabouwers zetten code om in een andere taal of machinecode. Machinecode wordt soms ook "native code" genoemd. Dit wordt gebruikt wanneer men het heeft over dingen die slechts op sommige computers werken.

Het schrijven van machine code

Machinecode kan in verschillende vormen worden geschreven:

  • Met behulp van een aantal schakelaars. Dit genereert een reeks van 1 en 0. Dit werd gebruikt in de begindagen van de informatica. Sinds de jaren 1970 wordt het niet meer gebruikt.
  • Met behulp van een Hex-editor. Dit maakt het mogelijk opcodes te gebruiken in plaats van het nummer van het commando.
  • Een Assembler gebruiken. Assembleertalen zijn eenvoudiger dan opcodes. Hun syntaxis is gemakkelijker te begrijpen dan die van machinetaal, maar moeilijker dan die van hoge-niveautalen. De assembler zal zelf de broncode in machinecode omzetten.
  • Het gebruik van een programmeertaal op hoog niveau maakt programma's mogelijk die code gebruiken die gemakkelijker te lezen en te schrijven is. Deze programma's worden vertaald naar machinecode. De vertaling kan in vele stappen gebeuren. Java-programma's worden eerst geoptimaliseerd tot bytecode. Daarna wordt het vertaald naar machinetaal wanneer het wordt gebruikt.
Voorpaneel van een vroege minicomputer, met schakelaars voor het invoeren van machinecode
Voorpaneel van een vroege minicomputer, met schakelaars voor het invoeren van machinecode

Typische instructies van machinecode

Er zijn vele soorten instructies die gewoonlijk in een instructieset voorkomen:

  • Rekenkundige bewerkingen: Optellen, aftrekken, vermenigvuldigen, delen.
  • Logische bewerkingen: Samenvoeging, splitsing, negatie.
  • Bewerkingen op afzonderlijke bits: bits naar links of rechts verschuiven.
  • Bewerkingen op het geheugen: een waarde van het ene register naar het andere kopiëren.
  • Bewerkingen die twee waarden vergelijken: groter dan, kleiner dan, gelijk.
  • Bewerkingen die andere bewerkingen combineren: optellen, vergelijken en kopiëren indien gelijk aan een waarde (als één bewerking), naar een bepaald punt in het programma springen indien een register nul is.
  • Operaties die inwerken op de programmastroom: spring naar een adres.
  • Bewerkingen die gegevenstypen omzetten: bv. een 32-bits geheel getal omzetten in een 64-bits geheel getal, een drijvendekommawaarde omzetten in een geheel getal (door afkappen).

Veel moderne processoren gebruiken microcode voor sommige commando's. Complexere commando's hebben de neiging deze te gebruiken. Dit wordt vaak gedaan met CISC-architecturen.

Instructies

Elke processor of processorfamilie heeft zijn eigen instructieset. Instructies zijn patronen van bits die overeenkomen met verschillende commando's die aan de machine kunnen worden gegeven. De instructieset is dus specifiek voor een klasse van processoren die (meestal) dezelfde architectuur gebruiken.

Nieuwere processorontwerpen bevatten vaak alle instructies van een voorganger en kunnen extra instructies toevoegen. Soms zal een nieuwer ontwerp de betekenis van een instructiecode schrappen of wijzigen (meestal omdat deze nodig is voor nieuwe doeleinden), hetgeen van invloed is op de compatibiliteit van de code; zelfs bijna volledig compatibele processoren kunnen voor sommige instructies een licht afwijkend gedrag vertonen, maar dit is zelden een probleem.

Systemen kunnen ook in andere details verschillen, zoals geheugenopstelling, besturingssystemen, of randapparatuur. Omdat een programma normaliter van dergelijke factoren afhankelijk is, zullen verschillende systemen gewoonlijk niet dezelfde machinecode uitvoeren, zelfs wanneer hetzelfde type processor wordt gebruikt.

De meeste instructies hebben een of meer opcodevelden. Deze specificeren het basisinstructietype. Andere velden kunnen het type van de operanden, de adresseringsmodus, enzovoort aangeven. Er kunnen ook speciale instructies zijn die in de opcode zelf zijn vervat. Deze instructies worden "immediates" genoemd.

Processorontwerpen kunnen ook op andere manieren verschillen. Verschillende instructies kunnen verschillende lengtes hebben. Zij kunnen ook dezelfde lengte hebben. Als alle instructies dezelfde lengte hebben, kan dat het ontwerp vereenvoudigen.

Voorbeeld

De MIPS architectuur heeft instructies die 32 bits lang zijn. Deze sectie bevat voorbeelden van code. Het algemene type instructie staat in het op (operation) veld. Het is de hoogste 6 bits. J-type (jump) en I-type (immediate) instructies worden volledig door op gegeven. R-type (register) instructies bevatten het veld funct. Het bepaalt de precieze werking van de code. De velden die in deze types worden gebruikt zijn:

    6       5           5          6 bits [ op | rs | rt | rd |shamt| funct] R-type [ op | rs | rt | adres/immediate] I-type [ op |         doeladres         ] J-type

rs, rt, en rd geven register operands aan. shamt geeft een shift bedrag. De adres- of immediate-velden bevatten direct een operand.

Voorbeeld: tel de registers 1 en 2 op. Plaats het resultaat in register 6. Het is gecodeerd:

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

Laad een waarde in register 8. Haal deze uit de geheugencel 68 cellen na de locatie die in register 3 staat:

[ op | rs | rt | address/immediate]     35      3      8            68            decimaal 100011 00011 01000 00000 00001 000100    binair

Ga naar het adres 1024:

[ op |         doeladres         ]      2                  1024                decimaal 000010 00000 00000 00000 10000 000000    binair

Verwante pagina's

  • Binair getallenstelsel
  • Quantum computers
  • Instructieset
  • Computer met beperkte instructieset

AlegsaOnline.com - 2020 / 2021 - License CC3