2009-10-05 21 views
21

Capisco come il codice viene compilato per il montaggio e quell'assieme è una sostituzione 1:1 con codici binari. Qualcuno può aiutarmi a capire in che modo binario è connesso all'hardware? Come si legge e si esegue fisicamente il file binario? Come funziona un'istruzione if nell'hardware?In che modo il binario si traduce in hardware?

Da google searches sto pensando che forse la mia titolo della domanda dovrebbe essere "come dati binari è messo su una linea di un autobus", ma non ero sicuro.

Grazie.

+2

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. –

+3

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

+1

"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

risposta

0

(Notevolmente semplificato)

Il binario (per esempio una stringa di binario da una linea di codice macchina/asm) viene caricato in memoria da dire disco. Quindi un'istruzione viene inviata dalla logica del processore al controller di memoria per caricare il contenuto della memoria in un resister locale del processore. Viene quindi interpretato come un'istruzione da eseguire dal processore.

Ho imparato questo livello di cose facendo microcoding al college.

In realtà ci sono molti altri passaggi che potrebbero verificarsi, a seconda della complessità e della potenza del processore. Il processore è composto da varie parti (ALU, registri, ecc.) E collabora per ottenere istruzioni, dati ed elaborazione. Se sei interessato a questo livello di comprensione e ti lodo per aver fatto la domanda, per esempio prendi un libro sull'architettura del computer. Ho usato Structure Computer Organisation da Tanenbaum al college.

+0

Grazie, ma ora sto cercando di semplificare :) –

+0

Quindi dipende molto dall'architettura del processore. –

0

In sostanza, e in senso lato, le istruzioni finiscono in memoria e il registro del programma (PC) contiene l'indirizzo della prima istruzione.

Il processore supporta le istruzioni che il carico può spostare i dati dalla/dalla memoria ai registri. Il processore sposta i dati nel registro delle istruzioni e quell'istruzione viene eseguita al successivo tick dell'orologio.

Non sono qualificato per spiegare l'ingegneria elettrica, ma probabilmente si potrebbe cercare.

Ovviamente tutto ciò è abbastanza semplificato, poiché nei processori moderni c'è un enorme parallelismo, e non pretendo nemmeno di ingannarlo in alcun modo significativo.

0

Si possono trovare questo link di interesse: http://www.eskimo.com/~ddf/Theory/Micro_Fund/Commands/AssyLnge.html

In una breve spiegazione, in genere l'applicazione viene caricato in una certa zona in memoria e il processore sarà dato l'indirizzo di partenza, per la parte principale o di partenza .

Un processore può fare due cose, può manipolare dati e spostare dati, quindi userà parti speciali sul microprocessore chiamato registri per memorizzare valori o posizione di cui avrà bisogno.

Quindi, per un'istruzione if, esiste un comando per indicare se due valori sono uguali e dove andare se non lo sono (ramo se non uguale). Ci saranno alcuni altri, come un ramo di uguale o un ramo di maggiore di.

Questi saranno nell'assemblea.

I comandi vengono inseriti nei registri, con gli argomenti appropriati e verranno calcolati al ciclo di clock successivo.

Questo è molto semplificato, ma in larga misura, ciò che vedete in assembly è ciò che vedrà il microprocessore.

Per entrare in maggiori dettagli sarebbe probabilmente fuori portata per StackOverflow.

9

Una risposta completa alla tua domanda includerebbe un libro e uno piuttosto spessa.

Quando si dice "codice" presumo che si stia riferendo a un linguaggio compilato di alto livello, come il C++. Di solito, un compilatore traduce questo codice in linguaggio macchina, o binario come affermi nella tua domanda. Eviteremo accuratamente ogni discussione sul codice gestito o non gestito, sul codice p, ecc. Cioè, stiamo solo parlando di compilatori che hanno come target specifici processori/sistemi operativi. Java, per esempio, compila in uno pseudo-codice chiamato bytecode. Eviteremo anche l'intera questione della modifica dei collegamenti o del collegamento, ovvero il modo in cui più moduli sorgente vengono compilati nel linguaggio macchina, quindi uniti insieme in un singolo programma eseguibile.

Ok, ora che abbiamo coperto la maggior parte di ciò che non stiamo andando a coprire, ecco cosa succede di solito. E per "solito", intendo la maggior parte dei linguaggi compilati in ambiente DOS, Linux o Windows. Il codice sorgente viene tradotto in linguaggio macchina, che viene scritto su un file eseguibile. Questo file eseguibile contiene, più o meno, un'immagine di come dovrebbe apparire il programma in memoria. Quando si dice al sistema operativo di eseguire il programma, viene eseguito l'equivalente del sistema operativo "Load and Go". Ciò significa che l'immagine di memoria nel file eseguibile viene caricata in memoria, quindi il sistema operativo esegue un JUMP di linguaggio macchina sulla prima istruzione del programma. La CPU quindi segue ciecamente le istruzioni da lì, fino a quando non si incontra un EXIT.

Tutto questo JUMP ... EXIT nastiness è una drastica semplificazione eccessiva per i sistemi operativi moderni. Come puoi immaginare, se la CPU dovesse seguire, con cieca obbedienza, le istruzioni di un programma che si è smarrito, il computer si bloccherebbe ... o peggio. Tale era il destino di molti programmi errati nei primi tempi, e uno dei primi contributori a molti un BSOD.

+1

A 965 pagine, un libro spesso. =) – Crashworks

4

Questo è un argomento enorme e molto complicato. Il miglior libro di testo che ho visto sull'argomento è Patterson/Hennesy's "Computer Organization and Design", che ha molte edizioni.

Oltre a suggerire di leggerlo, non oserei provare a stipare una lezione di un semestre in una casella di risposta di 500 caratteri.

1

Sembra una domanda "come funzionano i computer" ma non è probabile che tu sia soddisfatto dalle risposte che ricevi da Google.

I dettagli del modo in cui il binario è "connesso" all'hardware sono davvero il tema della progettazione del computer a livello base. Una certa conoscenza della progettazione hardware è molto utile per i programmatori, ma non strettamente necessaria.

Le risposte, finora, sono "Vastamente semplificate" perché, beh, devono essere.

In generale le spiegazioni saranno solo hanno senso per qualcuno che capisce l'argomento. Non penso che ci sia molto che possiamo fare al riguardo.

EDIT: forse il meglio che possiamo dire è che i bit di numeri binari (gli zeri e uno) corrispondono direttamente ai circuiti in hardware perché circuiti possono essere configurati per 'negozio' un valore di bit, e quelli i bit possono essere manipolati dal circuito.

Cioè, possono essere memorizzati, contati, aggiunti (e tutte le altre funzioni aritmetiche di base), output e input in gruppi che formano numeri interi.

In breve, i bit nei numeri binari corrispondono ai transistor nell'hardware. Questo, come hanno detto gli altri, è un'enorme semplificazione. Richiede spesso più di un transistor per gestire un po ', ma ciò dipende dall'intelligenza del progettista hardware.

3

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.

+1

Questo link al libro porta a un video che descrive un vm basato su stack completo con allu molto completa, tutto da zero-fetch/decode dell'istruzione. –

4

Esiste un codice denominato Book che ripercorre quello oltre a qualsiasi testo di organizzazione di computer. Le risposte qui sono tutte buone.

+2

Si chiama Code: The Hidden Language Of Computer Hardware & Software, di Charles Petzold. http://www.amazon.com/Code-Language-Computer-Hardware-Software/dp/0735611319 –

0

In modo molto semplificato il computer può essere rappresentato come un ciclo infinito (implementato nell'hardware) e le capacità di eseguire semplici operazioni aritmetiche (implementate anche nell'hardware). Nel loop esegue le seguenti operazioni:

  • leggere la memoria al PC (PC è il contatore di ciclo che viene incrementato)
  • decodifica il comando e operandi
  • eseguire il comando
  • scrivere i risultati posteriori alla memoria

E questo è tutto. Inoltre ci sono comandi di controllo che possono cambiare il PC e che sono usati per la frase "if ... then ... else".

0

Questa domanda è molto complicata, ho esattamente 2 gradi e ho ancora solo graffiato la superficie.

Se vuoi un'introduzione a come tutto ciò funziona insieme, MIT ha alcune classi gratuite disponibili che puoi consultare online. This uno è probabilmente il migliore per iniziare.

20

Penso che questa sia davvero una domanda divertente. Direi "ecco come costruire un computer in pochi semplici passaggi".

  • Iniziare con alcuni circuiti logici semplici, come AND, OR, NOT e un flip-flop. Un flip-flop è una coppia di transistor disposti in modo tale che se uno è ON, l'altro è OFF, o viceversa. In questo modo può "ricordare" un bit di informazione, quindi puoi pensare a come memorizzare una singola cifra binaria. Alcune linee di input possono metterlo in uno stato o nell'altro e quindi "scriverci".

  • È possibile memorizzare un numero maggiore con un paio di infradito e chiamarlo "registro". Ad esempio, se hai quattro flip-flop in un registro, ci sono 16 combinazioni possibili, quindi puoi pensare che sia un numero compreso tra 0 e 15.

  • Salta un po ', puoi comprare un "chip di memoria". Quello che è è un buon numero di registri, come diciamo 16 di loro. Ha 4 fili in arrivo (i fili "indirizzo"), e ha 4 fili in uscita (i fili "dati"). Quindi un numero compreso tra 0 e 15 può entrare come un indirizzo e seleziona uno dei 16 registri, il cui valore è presentato sui fili dei dati di uscita (quindi "leggendolo"). Un altro paio di fili può far entrare i dati IN sui fili dei dati per fare in modo che i numeri vengano inseriti ("scritti") nel registro.

  • Ora supponiamo di avere un registro esterno a 4 bit (lo chiamano R), e un po 'di circuiti, in modo che

    1. presenta il valore di R per l'indirizzo di memoria
    2. legge il valore a 4 bit in detto registro e sposta in R
    3. e ripete più e più

seconda t I numeri che sono stati precaricati nella memoria, puoi vedere che questa cosa scorrerà attraverso una serie di indirizzi numerici, perché il numero di ogni indirizzo determina quale sarà il prossimo indirizzo.

Ora puoi abbellire questa cosa in molti modi. È possibile espandere la memoria per avere 5 bit di indirizzo (32 registri). Quindi se una delle linee di indirizzo è collegata al mondo esterno, farà cose diverse a seconda del mondo esterno. Questa è una "macchina a stati finiti".

È possibile sostituire il registro R con un contatore semplice e chiamarlo "contatore del programma". Puoi prendere i dati che escono dalla memoria e chiamarli "istruzione", e usare alcuni dei suoi bit per leggere altri indirizzi di memoria e caricare una serie di registri aritmetici. Puoi usarne alcuni per controllare se il registro R si incrementa semplicemente, o magari ottiene un nuovo indirizzo memorizzato in esso. Questo si chiama "saltare".

Naturalmente, questo è un computer molto semplice, ma è più o meno come hanno iniziato.

+0

Che libro consiglieresti su questo argomento? Voglio dire, dall'hardware stesso (come hai fatto qui), come funzionano i transistor, ecc. So che nei corsi EE devono insegnarlo, ma non riesco a trovare un libro che parta da quel livello basso.=) –

+1

@RafaelDiasdaSilva: È passato molto tempo da parte mia, ma a parte l'elettronica di base, sono appassionato di "Introduzione ai sistemi VLSI", di Mead e Conway, Addison Wesley, anche se ha 3 decenni. Passano dai transistor di base fino alle CPU e alla memoria, in particolare sui chip. –

0

SW non è solo il linguaggio SW in cui è scritto, come ad esempio annotato su un pezzo di carta. Il SW assume anche la forma fisica. Ad un certo punto il software a livello concettuale si sovrappone al software a livello fisico, e ciò si verifica quando un programmatore inizia a digitare il codice in una tastiera in qualsiasi linguaggio SW lui/lei stia lavorando. Dal momento in cui viene premuto un tasto, gli elettroni si abbassano completamente ... questo è il punto allora, dove si verifica l'interfaccia, dal momento che dal momento in cui una tastiera viene sfruttata l'intera azienda diventa la manipolazione degli elettroni - così complessa, uno sforzo sofisticato e ingegnoso come potrebbe essere. Pensare in termini di binari 0 e 1 è solo una metafora per la bassa tensione &, già una manifestazione fisica oltre la sequenza di tasti. Quando si digita la lettera I come prima lettera di IF ... THEN in una tastiera, le tensioni corrispondenti a 01001001 vengono posizionate nei primi 8 slot del registro, tramite impulsi elettrici indotti dal tocco fisico del tasto I. Da qui in avanti è l'elettronica.

0

Ogni cosa che scrivi su un editor di testo, per prima cosa, viene memorizzata in una memoria (segnali elettrici generati dalla tastiera) indipendentemente dal codice (ascii, ...). Dalla memoria, questi segnali vengono inviati al monitor del computer e puoi vedere il codice sorgente che stai digitando. Quindi, si esegue il compilatore (o assemblatore) che legge il codice sorgente in memoria (segnali elettrici) e lo converte in codice macchina, memorizzando quelli trasformati segnali elettrici in un'altra regione della memoria (segnali elettrici di nuovo). Quando la cpu legge il codice macchina, ciò che vede sono segnali elettrici. Non ci sono livelli logici, quindi non è necessario convertire il livello logico nel livello di tensione.

1

Quando guardiamo a Binary oa un linguaggio di programmazione, guardiamo a simboli e parole che un umano può capire e che descrivono essenzialmente l'attività elettrica di un sistema elettronico. In definitiva, velocità di energia, quantità di energia, perdita di energia, creazione di calore e luce, e il CAMBIAMENTO che la sostanza che l'energia sta attraversando subisce come risultato di essere energizzata e come ciò influenza l'attività dell'energia mentre scorre è inteso da un essere umano e manipolato o imbrigliato con un pezzo di elettronica.Un fattore nella comprensione del complesso sistema che è un computer o un altro dispositivo, è sapere cosa sta facendo l'elettricità che scorre all'interno di esso. Per sapere questo abbiamo descritto uno dei comportamenti dell'elettricità usando i numeri 1 e 0. È necessario sapere cosa sta facendo un elemento fisico ed essere in grado di fornire una descrizione standard di quello per tenere traccia di ciò che accade mentre si cambiano i fattori che tu pensi contribuisca al controllo dell'elemento/Sostanza/Particella Subatomica, i numeri ti aiutano a razionalizzare ciò che accade con particelle che altrimenti non sei in grado di vedere.

Quindi Binary è una rappresentazione visiva che utilizza i numeri per descrivere l'attività dell'elettricità in un componente hardware. O il loro è un flusso di carica o il loro non è un flusso di carica. La carica viene convertita in D/C da AC e l'attività delle particelle cariche viene stabilizzata dall'orologio, dalla velocità dell'energia che fluisce attraverso il circuito, dalla resistenza (che si traduce in una perdita di energia e nella creazione di calore, e la quantità di tempo che trascorre prima che un pezzo di un circuito venga disenergizzato si riunisce e ci consente di comprendere e utilizzare la nostra comprensione di questi fenomeni per ottenere un'unità di misura per standardizzare la quantità di energia che scorre per un'unità di tempo. ci assiste ulteriormente mentre cerchiamo di sfruttare l'energia.Il resto dei componenti del computer è come un sistema molto avanzato di transistor, condensatori e resistori che manipolano la carica che scorre verso e attraverso questi componenti, i componenti intrappolano la carica temporaneamente o lentamente fino a quando il componente raggiunge un certo livello di energia e quindi si verifica un arco elettrico che fa sì che l'energia accumulata ecciti un altro componente o area del sistema con una quantità specifica (altamente controllata) di e nergy. ogni cifra di binario è una rappresentazione di un bit, un po 'è una spiegazione del comportamento elettrico in un determinato componente elettrico (noto da qui in avanti come segnale), un byte è 8 pezzi di segnale elettrico. È generalmente accettato che siano necessari almeno 8 bit di segnale elettrico affinché il computer possa fare un uso ordinato e pratico dell'energia elettrica che vi fluisce. In altre parole, l'elettricità è appena ridotta e l'energia si è stabilizzata nel suo comportamento e quindi divisa e diretta attraverso una serie di componenti che hanno bisogno dell'elettricità per funzionare e quindi i componenti di nuova energia fanno una cosa che un umano desidera che faccia .

+0

Non sono sicuro che questo risponda alle domande ("come funziona un'istruzione if nell'hardware"). Le domande erano più legate alle architetture della CPU, ad esempio il recupero delle istruzioni, le pipeline della CPU, ecc ... –

Problemi correlati