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.