In che modo un processore "sa" cosa significano i diversi comandi?
Sto pensando a comandi a livello di assembly come MOV, PUSH, CALL, ecc ...
In che modo un processore "sa" cosa significano i diversi comandi?
Sto pensando a comandi a livello di assembly come MOV, PUSH, CALL, ecc ...
Risposte:
Quando un computer interpreta le istruzioni a livello di assieme , queste istruzioni vengono convertite nei loro equivalenti binari per la lettura della CPU. Quando la CPU esegue le istruzioni, interpreta la parte opcode dell'istruzione in singoli "microprogrammi", contenenti i loro equivalenti microcodici . Solo per questo, un'istruzione di assemblaggio completa è costituita da un codice operativo e da tutti i dati applicabili che ne derivano, se necessario (ad esempio nomi di registro, indirizzi di memoria).
Le istruzioni del microcodice sono di livello estremamente basso (più quindi del montaggio) e controllano i segnali digitali effettivi che controllano il flusso della logica nel microprocessore. Ad esempio, un'istruzione di microcodice potrebbe aggiornare un flag di registro di codice condizione con un nuovo valore o collegare un registro CPU con una delle unità ALU . Sono possibili attività più complesse, ma ciò mostra l'idea generale di quale microcodice viene utilizzato.
Il flusso generale dalla compilazione all'esecuzione è il seguente. Le istruzioni di assemblaggio sono assemblate (trasformate nei loro 0 e 1 equivalenti binari o, d'ora in poi, segnali logici). Questi segnali logici sono a loro volta interpretati dalla CPU e trasformati in segnali logici di livello più basso che dirigono il flusso della CPU per eseguire l'istruzione particolare. Questo può richiedere uno o più cicli di clock, a seconda dell'architettura e del design del processore (la maggior parte dei manuali di riferimento del processore indicano quanti cicli di clock sono necessari per eseguire una particolare istruzione, come ad esempio questa ).
Tutto questo viene fatto con un microcodice programmato (incorporato fisicamente nel processore in una sorta di ROM , impostato durante la produzione), che dirige il flusso attraverso le porte logiche di basso livello . Ciò fornisce un'interfaccia tra le istruzioni di assemblaggio astratte e la logica elettrica fisica nel processore.
Quindi, in sintesi, le istruzioni del processore vengono assemblate e caricate dal processore. Il processore utilizzerà quindi queste istruzioni per cercare il microprogramma (sotto forma di microcodice) corrispondente a quella particolare istruzione, che è ciò che "effettivamente" esegue l'istruzione. Una volta eseguiti i microcodici per la particolare istruzione (che può richiedere uno o più cicli di clock), il processore esegue il microcodice per recuperare l'istruzione successiva e il ciclo si ripete.
Il processore in realtà non "conosce" quali sono i comandi. I comandi sono solo schemi binari che inducono il processore a fare ciò che interpretiamo come comandi.
Ad esempio, un'operazione ADD-R1-in-R2 farà sì che i valori dei registri 1 e 2 raggiungano l'ALU (unità aritmetica e logica), inducano l'ALU a utilizzare l'output dell'adder anziché le varie altre cose e causare il output dell'ALU per sostituire il valore nel registro 2. Esistono semplici circuiti logici per ottenere tutto ciò ( multiplexer , adder , counter , ...), sebbene i processori reali utilizzino ottimizzazioni molto complicate.
È come se ti chiedessi come un'auto sa rallentare quando premi i freni. L'auto non lo sa, il pedale del freno capita solo indirettamente di controllare come vengono premuti i cuscinetti rigidi contro le ruote.
Prendi, ad esempio, l'istruzione che dice a un processore x86 / IA-32 di spostare un valore immediato a 8 bit in un registro. Il codice binario per questa istruzione è 10110 seguito da un identificatore a 3 bit per quale registro utilizzare. L'identificatore del registro AL è 000, quindi il seguente codice macchina carica il registro AL con i dati 01100001.
10110000 01100001
Questo codice binario del computer può essere reso più leggibile dall'uomo esprimendolo in esadecimale come segue
B0 61
Qui, B0 significa "Sposta una copia del seguente valore in AL", e 61 è una rappresentazione esadecimale del valore 01100001, che è 97 in decimale. Il linguaggio assembly di Intel fornisce il MOV mnemonico (un'abbreviazione di move) per istruzioni come questa, quindi il codice macchina sopra può essere scritto come segue nel linguaggio assembly, completo di un commento esplicativo se richiesto, dopo il punto e virgola. È molto più facile da leggere e ricordare.
http://en.wikipedia.org/wiki/Assembler_language
In altre parole, quando "assembli" il tuo programma di assemblaggio, le tue istruzioni come
MOV AL, 61h
vengono convertiti in numeri, ai quali la CPU associa un significato speciale e quindi agisce di conseguenza.
Letture consigliate:
Consulta anche le note del corso di CS152: Computer Architecture and Engineering presso UC Berkeley, un corso in cui gli studenti implementano una CPU.
Se cerchi Google "CPU per la casa", troverai molti gadget.
All'estremo livello più basso, tutto ciò che la CPU può fare è aggiungere. Dall'aggiunta, può sottrarre, moltiplicare e dividere (visto che si tratta solo di un'aggiunta in un modo diverso). La CPU lo utilizza per spostare i dati in memoria applicando le aggiunte agli indirizzi di memoria.
Tieni presente, tuttavia, che questo è al livello più basso possibile. La CPU infatti "capisce" alcuni comandi, sotto forma di microcodice. Vedi la risposta di Breakthrough, è scritta molto bene.
Ho fornito una risposta correlata su programmers.stackexchange.com, vedi Come funzionano i computer? dove ho camminato brevemente su tutto da zero su come i computer interpretano le istruzioni per muovere gli elettroni.