Opcode
Een opcode (een afkorting van operation code) is een deel van een instructie aan een computer die aangeeft welke bewerking uitgevoerd moet worden.
Een instructie die door een computer wordt uitgevoerd, bestaat meestal uit twee delen: de opcode en de operanden. Er zijn twee soorten opcodes: in de machinetaal en in de assembleertaal. De laatste worden mnemonische opcodes genoemd.
Luidt de instructie bijvoorbeeld dat er vijf moet worden opgeteld bij register EBX, dan is:
- opcode: 'optellen bij een register'
- operanden: 'EBX' en '5'
De machinecode (voor 32-bits x86) van deze instructie is 83C305. De opcode is 83C, het register EBX wordt aangeduid met 3 en de bij te tellen waarde is 05.
De assemblerinstructie is:
ADD EBX,5
Hierin is ADD de mnemonische opcode.
In het gegeven voorbeeld komen de opcodes niet precies met elkaar overeen. Uit de mnemonische opcode 'ADD' blijkt namelijk dat er moet worden opgeteld, maar niet dat er bij een register moet worden opgeteld. Dat blijkt pas uit de operand 'EBX'. Er zijn assembleertalen waarin er wel een directe een-op-eenrelatie is tussen de opcode in de machinetaal en de mnemonische opcode. Zo maakt de assembleertaal van de IBM 360 onderscheid tussen de mnemnnische opcodes 'A' (optellen van waarde in het geheugen) en 'AR' (optellen van waarde uit register). De assemblerinstructies zijn:
A 4,8 Tel de inhoud van adres 8 op bij register 4 AR 4,8 Tel de inhoud van register 8 op bij register 4
Ongedocumenteerde opcodes
bewerkenDe fabrikant van een computer of processor geeft documentatie uit waarin de opcodes beschreven worden, zodat het mogelijk is software te ontwikkelen. Nu zullen er haast altijd bitcombinaties zijn die niet beschreven zijn. Meestal zwijgt de fabrikant hierover, of hij beschrijft ongedocumenteerde opcodes met woorden als 'gereserveerd' of 'onvoorspelbaar gedrag'. Ook is het mogelijk dat een ongedocumenteerde opcode een gedocumenteerde interrupt veroorzaakt.
Natuurlijk zullen er altijd mensen zijn die deze ongedocumenteerde opcodes uitproberen. Soms blijkt dat ze hetzelfde doen als een andere, wel gedocumenteerde opcode. Meestal komt dat doordat de elektronica van de processor zo eenvoudig mogelijk is gehouden. Het komt ook weleens voor dat een ongedocumenteerde opcode een zeer nuttige bewerking uitvoert, maar dat de fabrikant heeft besloten deze mogelijkheid niet te publiceren.
Sommige softwareontwikkelaars gebruiken de ongedocumenteerde opcodes om het disassembleren te bemoeilijken of om te kunnen aantonen dat een programma met hun pakket ontwikkeld is.
Het is enigszins riskant een ongedocumenteerde opcode te gebruiken, want de fabrikant van de processor garandeert niet dat een volgende versie van de processor die opcode ook kan uitvoeren. Aan de andere kant zal de fabrikant ernaar streven de ongedocumenteerde opcodes ook in de nieuwe versie in te bouwen, want hij weet dat hij de schuld krijgt als een programma op de nieuwe processor ineens niet meer werkt.
Een beroemde ongedocumenteerde instructie is LOADALL, waarmee alle registers in een keer geladen kunnen worden. Deze instructie is te vinden in de 80286 en de 80386 - niet in latere processors. De opcodes zijn niet gelijk: op de 80286 is het 0F05 en op de 80386 0F07, en het gedrag is ook niet gelijk. Het was vrijwel onmogelijk deze gecompliceerde instructie te ontdekken door het gedrag van de processor te onderzoeken, en hij is dan ook bekend geworden doordat een document van Intel is uitgelekt. De instructie was bedoeld om de processor te kunnen testen, maar hij bleek zeer bruikbaar om het volledige geheugen te adresseren terwijl de processor in real mode stond. De instructie werd dan ook in veel commerciële software toegepast.