Non vedo questo come enorme e complicato, più vicino all'hardware è il più semplice.
Scrivi un disassemblatore, ecco come funziona l'hardware. La maggior parte dei processori include opcode o set di istruzioni nello stesso manuale della lingua dell'assembler.
Esaminare l'opcode per dire un'istruzione di aggiunta utilizzando i registri, alcuni dei bit determinano il registro di origine, alcuni bit per il registro di destinazione alcuni bit dicono che questa è un'istruzione di aggiunta. Diciamo che questo set di istruzioni che stai osservando usa solo due registri per aggiungere un registro. C'è un po 'di logica, un sommatore, che può aggiungere due elementi della dimensione dei registri e generare un risultato e un carry bit. I registri sono memorizzati su chip in bit di memoria a volte chiamati flip flop. Quindi, quando viene decodificato un add, i registri di input sono legati alla logica di aggiunta mediante interruttori elettronici. In questi giorni ciò accade all'inizio del ciclo di clock, alla fine del ciclo di clock il sommatore ha un risultato e l'output viene indirizzato ai bit per il registro di destinazione e la risposta viene acquisita. Normalmente un add modifica i flag nel registro flag. Quando il risultato è troppo grande per essere memorizzato nel registro (pensate a cosa succede quando aggiungete i numeri decimali 9 e 1 ottenete uno 0 portando il 1 giusto?). C'è una logica che guarda l'output dell'adder e confronta i bit con il valore zero che imposta o cancella l'indicatore z nel registro flag. Un altro bit di flag è il bit o bit di segno per il negativo, ovvero il bit più significativo della risposta. Questo è tutto fatto in parallelo.
Quindi dire che la prossima istruzione è saltare se zero (salta se uguale), la logica guarda la bandiera z. Se impostato, l'istruzione successiva recuperata si basa sui bit nell'istruzione che vengono aggiunti al contatore del programma tramite lo stesso o un altro sommatore. O forse i bit nell'istruzione puntano a un indirizzo in memoria che contiene il nuovo valore per il contatore del programma. O forse la condizione è falsa, quindi il contatore del programma viene ancora eseguito attraverso un sommatore, ma ciò che viene aggiunto è la dimensione dell'istruzione in modo che recuperi l'istruzione successiva.
Il tratto da un disassemblatore a un simulatore non è lungo. Crea variabili per ciascuno dei registri, decodifica le istruzioni, esegui le istruzioni, continua. La memoria è una matrice che hai letto o scritto. Il disassemblatore è il tuo passo di decodifica. Il simulatore esegue gli stessi passaggi dell'hardware, l'hardware lo fa in parallelo utilizzando diversi trucchi di programmazione e diversi linguaggi di programmazione.
A seconda di come può essere implementato il disassemblatore all'inizio del programma e smontare fino alla fine, il simulatore inizierà all'inizio ma seguirà l'esecuzione del codice che non necessariamente inizia alla fine.
I vecchi simulatori di console di gioco come MAME hanno simulatori di processore che puoi guardare. Sfortunatamente, specialmente con MAME, il codice è progettato per la velocità di esecuzione non leggibile e la maggior parte sono completamente illeggibili. Ci sono alcuni simulatori leggibili là fuori se si guarda però.
Un amico mi ha indicato questo libro http://www1.idc.ac.il/tecs/ che mi piacerebbe leggere, ma non ancora. Forse è solo il libro che stai cercando.
L'hardware sicuro si è evoluto dalle macchine di stato banali che richiedono molti clock per il recupero, la decodifica e l'esecuzione seriale. La mia ipotesi è che se hai appena capito il classico recupero, decodifica ed esegui è sufficiente per questa domanda. Quindi potresti avere altre domande più specifiche, o forse ho frainteso la domanda e volevi davvero capire il bus di memoria e non il decodificatore.
Ci sono interi corsi che trattano questo argomento. Quando ho preso i microprocessori nei miei studi EE, abbiamo progettato un processore a 8 bit, ma sono state necessarie 14 settimane di note. Quindi, la cosa migliore, se vuoi davvero capire, è seguire un corso EE, il che significa che devi prima aver padroneggiato la progettazione logica, dato che i multiplexer sono usati molto in questo. E ora, con il pipelining, diventa molto più complicato. Per capire che avresti bisogno di seguire un corso in Computer Architecture. –
La risposta a questo piccolo aspetto di questo argomento - "come sono i dati binari messi sulla linea di un autobus" - può essere trovata nel documento di Ulrich Drepper: http://people.redhat.com/drepper/cpumemory. pdf – Crashworks
"Codice binario" è un argomento più ampio di quello che stai chiedendo; invece, prova a cercare "linguaggio macchina". La compilazione dell'assieme al codice macchina non è necessariamente un processo 1: 1, anche senza ottimizzazione. – outis