Qual è la differenza tra il RISC e il formato delle istruzioni dell'8086?
La filosofia/obiettivo dietro la progettazione del RISC (Reduced Instruction Set Computer) è di rendere tutte le istruzioni della stessa lunghezza e di poterle eseguire nello stesso tempo. In questo modo, la pipeline di istruzioni scorrerebbe ad una velocità (più) uniforme, permettendo certe ottimizzazioni nell'hardware e/o nel microcodice (sovrapposizione di fasi di elaborazione, processori, ecc.)
La famiglia x8086 ha istruzioni che hanno lunghezze da 1 byte in su, rendendo più difficile e più lenta la decodifica dell'istruzione (in media): si deve leggere il primo byte per determinare quanti byte aggiuntivi devono essere caricati prima della decodifica.
(Sto semplificando molto. Questa è roba complessa!)
RISC significa anche avere registri che erano dello stesso tipo (tipicamente registri interi e registri di indirizzo) e invece di avere molti registri di uso speciale. Con l'x86, non ci sono due registri uguali.
RISC è simile a una catena di montaggio di una fabbrica che sta costruendo auto molto simili che hanno la stessa lunghezza e complessità di tempo per essere costruite. La linea si muove (più) agevolmente. I passi che possono essere iniziati prima che il passo precedente sia finito, sono iniziati.
8086 è simile a una catena di montaggio di una fabbrica che ha un misto di Yugos e limousine stretch, la cui lunghezza e complessità varia molto. Questo significa che la catena di montaggio deve fermarsi molto tempo in attesa di un'istruzione lenta. C'è bisogno di un sacco di meccanica specializzata. Alcune istruzioni x86 corte (1 byte) impiegano meno tempo per essere eseguite rispetto alla corrispondente istruzione RISC, ma molte (quelle più lunghe) impiegano più tempo.
Come compromesso, alcune volte devono essere eseguite più istruzioni RISC invece di una singola istruzione x86 corrispondente ma più lunga. Così una macchina di tipo x86 potrebbe avere un'istruzione di spostamento da memoria a memoria. Un RISC avrebbe due istruzioni: caricare dalla memoria in un registro, poi memorizzare dal registro alla memoria.
Un grande esempio di come un chip RISC possa funzionare meglio è l'esempio di un'istruzione di diramazione incondizionata:
- Tutte le prossime istruzioni dal buffer di prefetch vengono buttate via (poiché non sono più necessarie)
- Al tempo stesso, l'indirizzo della destinazione del ramo verrà caricato
- L'istruzione dell'indirizzo di destinazione verrà caricata
- Questa nuova istruzione sostituirà l'istruzione di ramo nella pipeline delle istruzioni
- Per quando il processore RISC avrebbe iniziato a decodificare l'istruzione di ramo, ora sta effettivamente decodificando l'istruzione di destinazione!
Questo significa che su un chip RISC, un'istruzione di diramazione incondizionata viene eseguita in zero cicli!
L'effetto complessivo di ciò è che i chip della famiglia x8086 tendono ad essere più grandi, più caldi e a consumare più energia dei corrispondenti chip RISC della stessa capacità.
Non troverete un chip x86 in dispositivi a bassa potenza come i telefoni cellulari: il chip x86 è troppo grande, si surriscalda troppo e prosciuga la batteria più velocemente.
Come vantaggio collaterale, è facile iniziare a disassemblare il codice macchina RISC a qualche indirizzo allineato a parole e vedere il codice reale. Con l'x86, se non iniziate a disassemblare al giusto indirizzo di byte, vedrete un mucchio di istruzioni senza senso.
Articoli simili
- Quali sono i vantaggi e gli svantaggi del set di istruzioni Thumb rispetto alle istruzioni ARM a 32 bit?
- Qual è la differenza tra l'architettura ARM e il RISC regolare?
- Qual è la differenza tra le istruzioni di assemblaggio movq e movl?
- Qual è la differenza tra un'istruzione LDM e una VLDM nell'architettura del set di istruzioni ARM?