Diamo un'occhiata a una vera e propria istruzione della macchina. Supponiamo di avere una CPU ARM e vogliamo aggiungere 143 al valore nel registro 2, posizionando il risultato nel registro 1. Nel linguaggio assembly ARM scritto
ADD R1, R2, #143
Questa istruzione di assemblaggio può essere codificata come singola istruzione macchina. La specifica di come è fatto nella pagina fisica 156 del BRACCIO ARM , in modo divertente- denominato Manuale di riferimento sull'architettura della macchina RISC di Acorn. È anche necessario guardare la definizione di "shifter operando", che inizia sulla pagina fisica 444.
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
| Cond | 0 0 I 0 1 0 0 S| Rn | Rd | shifter operand |
Come sembra che tu abbia già capito, le istruzioni della macchina sono numeri e, sul ARM, sono numeri di una dimensione fissa: 32 bit, suddivisi in diversi campi. Per codificare l'ADD sopra, compiliamo i campi in questo modo:
| cond | fmt | I | opcode | S | Rn | Rd | rot | imm |
| E | 00 | 1 | 0100 | 0 | 2 | 1 | 0 | 143 |
(Il "shifter operand" è stato diviso in "rot" e "imm" perché ho impostato I = 1.) Ora, per farlo in un singolo numero a 32 bit, dobbiamo espanderlo in binario, perché molti dei campi non sono in ordine numeri di bit lunghi:
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
1 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 1
Per gli umani è una grande sfocatura; esadecimale è più facile per noi capire:
1110 0010 1000 0010 0001 0000 1000 1111
E 2 8 2 1 0 8 F
E così di solito, in comunicazione con altri umani, diciamo che la "istruzione macchina" corrispondente a ADD R1, R2, #143
è il numero esadecimale E282 108F
. Noi potremmo dire ugualmente che è il decimale numero 3.800.174.735, ma che oscura il modello dei campi più di quello esadecimale. (Qualcuno con molta pratica di debug sul bare metal su ARM sarebbe in grado di selezionare il codice di condizione E, i registri di origine e destinazione 2 e 1, l'operando immediato 8F = 143 su E282 108F
con relativa facilità.)
Tutte le rappresentazioni di cui sopra codificano la stessa istruzione della macchina! Ho solo cambiato il modo in cui l'ho scritto.
In termini di "uno e zero", se si carica un programma contenente questa istruzione nella RAM su un computer reale, da qualche parte in memoria apparirà il modello di bit 1110 0010 1000 0010 0001 0000 1000 1111 (probabilmente indietro, a causa di < a href="https://en.wikipedia.org/wiki/Endianness"> endianness ). Ma è altrettanto valido dire che da qualche parte in memoria il numero esadecimale E282 108F
, o l'istruzione decodificata ADD R1, R2, #143
appare. I pattern di bit nella RAM non hanno significato in se stessi; il significato deriva dal contesto. Viceversa, quel modello di bit / numero esadecimale non è necessariamente un'istruzione! Comparirebbe anche in un programma che utilizzava il numero intero a 32 bit senza segno 3.800.174.735, o il numero in virgola mobile IEEE a precisione singola -1.199634951 × 10 21 come dati .