La CPU e il linguaggio macchina

La CPU (Central Processing Unit) è il componente principale di un computer, è responsabile dell'esecuzione delle istruzioni di ogni programma. La CPU elabora delle istruzioni elementari in un ciclo composto da tre fasi:

  • fetch (prelievo), ovvero l'istruzione viene letta dalla memoria RAM
  • decode (decodifica) ovvero i byte corrispondenti all'istruzione vengono decodificati e interpretati
  • execute (esecuzione) ovvero l'istruzione viene eseguita.

Una istruzione potrebbe svolgere calcoli aritmetici, logici, controllo del flusso, scritture o letture in memoria RAM, oppure interazioni con l'hardware o il sistema operativo.

La CPU ha al suo interno dei registri, che mantengono, insieme alla memoria RAM, lo stato di esecuzione del programma. Tra questi, uno dei più importanti è il program counter (a volte denominato instruction pointer), che mantiene l'indirizzo della prossima istruzione da eseguire. Alcune istruzioni possono cambiare il valore di questo registro, ad esempio quando si vuole chiamare una funzione oppure saltare a specifiche istruzioni.

La CPU quindi, può interpretare solamente il proprio linguaggio macchina che è composto da una sequenza di byte. Possiamo interpretare questa sequenza per renderla leggibile tramite l'uso di un disassemblatore, che ci restituisce il codice assembly corrispondente. Queste due rappresentazioni contengono esattamente le stesse informazioni, e si può passare da una rappresentazione all'altra con facilità. Ad esempio la sequenza di byte

554889e54883ec10c745f402000000c745f8030000008b55f48b45f801d08945fc8b45fc89c6

corrisponde al seguente codice assembly

push   rbp
mov    rbp,rsp
sub    rsp,0x10
mov    DWORD PTR [rbp-0xc],0x2
mov    DWORD PTR [rbp-0x8],0x3
mov    edx,DWORD PTR [rbp-0xc]
mov    eax,DWORD PTR [rbp-0x8]
add    eax,edx
mov    DWORD PTR [rbp-0x4],eax
mov    eax,DWORD PTR [rbp-0x4]
mov    esi,eax

In questo modulo ci concentreremo sul linguaggio macchina x86, che è attualmente il più diffuso tra i computer desktop e server. Non è però l'unico possibile, per esempio il set di istruzioni ARM è molto diffuso nell'ambito degli smartphone e ultimamente anche di alcuni portatili e server. Altre architetture sono possibili, per citarne alcune RISC-V, AVR, MIPS, e molte altre.

Si assume una familiarità di base con il linguaggio assembly e soprattutto con x86, è possibile comunque fare riferimento al manuale ufficiale Intel, e alle varie guide e libri disponibili online.