2012-04-25 19 views
9

Sembra che ci siano molte opinioni su cosa sia effettivamente il codice macchina. Ho sentito alcuni dire che è assemblea, o binario o esadecimale.Che aspetto ha il codice macchina effettivo in vari punti?

È corretto dire che il codice macchina è essenzialmente un insieme di istruzioni per un particolare processore? Se è così, immagino che questi possano essere rappresentati in notazione binaria o esadecimale o assemblaggio. Ma come appare il codice macchina "reale" non tradotto? Si basa sulla dimensione della parola dell'architettura? O è esadecimale per tutti gli effetti la rappresentazione di default?

Che aspetto ha quando si trova su un disco rigido? Come appare quando si è seduti in un registro? Che ne dici di quando viene elaborato, è semplicemente un insieme di cambiamenti di tensione a quel punto?

+6

e 'valori binari con un significato solo per il processore specifico. Puoi rappresentarlo come esagono se lo desideri, o qualsiasi altra base che ti piace. Sembra "tuttavia" si sceglie di rappresentarlo. –

+2

Non è assemblaggio, binario o esadecimale, è tutto :-) Sono solo rappresentazioni della stessa cosa. In definitiva assemblaggio ed esadecimale sono entrambi mappati in binario. Quel binario si adatta allo stato di un gruppo di transistor nella CPU. Quello stato potrebbe rappresentare un'istruzione da elaborare o potrebbe rappresentare i dati su cui lavorare. – Benj

+1

Sono zero e uno, niente di più. Le istruzioni esadecimali e di assemblaggio sono per le persone, non per i computer. –

risposta

15

Il codice macchina è semplicemente dati binari che corrispondono alle istruzioni della CPU per una specifica architettura del processore.

Non entrerò nel modo in cui è memorizzato troppo, perché dipende da dove è memorizzato. Su disco, ad esempio, viene generalmente memorizzato come una sequenza di regioni magnetizzate. Il codice macchina non è diverso da altri dati binari nell'aspetto di archiviazione. Se la tua domanda riguarda più come i dati sono archiviati su un computer, dovresti ricercare i vari dispositivi di archiviazione dei dati in un computer, come HDD, RAM e registri, per citarne alcuni.

Il modo più semplice per visualizzare il modo in cui è memorizzato il codice macchina è esaminarne alcuni in un editor esadecimale. Questo ti mostra i dati binari rappresentati da numeri esadecimali. Per esempio, prendiamo l'istruzione:

0xEB 0xFE 

Questo potrebbe essere facilmente scritto 1110101111111110, o 60414. Dipende da come si desidera convertire binario in formato leggibile.

Questa istruzione rappresenta un ciclo infinito. (Questo è ammesso che viene eseguito su una CPU x86 Altro CPU potrebbe interpretarlo come vogliono..) Può essere codificato in assemblea come questo:

j: 
jmp j 

Quando si esegue l'assemblatore, ci vuole il codice di cui sopra e lo trasforma nel codice della macchina binaria sopra.

L'istruzione è composta da due parti. Il primo è ciò che è noto come opcode ed è lo 0xEB. Quando questo codice entra nella CPU, significa: legge un byte dal programma e salta quel numero di byte di dati. Quindi la CPU legge il byte 0xFE. Poiché prevede un numero intero con segno, interpreta i dati binari come numero -2. L'istruzione viene quindi eseguita in lettura e il puntatore di istruzioni avanza di 2 byte. L'istruzione viene quindi eseguita, facendo in modo che il puntatore dell'istruzione si muova in avanti di -2 (0xFE) byte, il che imposta efficacemente il puntatore dell'istruzione sullo stesso valore che aveva quando è stata avviata l'istruzione.

Spero che questo risponda alla tua domanda. Se ti stai chiedendo il funzionamento interno della CPU, leggi su microcode e porte logiche elettroniche. Fondamentalmente, si tratta di una serie di differenze di tensione, come ad esempio un 1 bit essendo una carica di 5 volt e un 0 bit che è una carica a 0 bit.

+0

Quindi per chiarire, è più accurato fare riferimento al codice macchina come codice byte, non rappresentato realmente come codice binario. Certo, un insieme di bit costituisce un byte, ma la dimensione atomica minima delle istruzioni macchina esiste effettivamente a livello di byte? –

+0

In pratica, quasi sempre, poiché la tecnologia attuale è progettata per funzionare con byte, non bit. In teoria, no. Ad esempio, una CPU basata sul linguaggio brainf * ck potrebbe avere istruzioni a 3 bit. –

+0

Grazie a Kendall, è bene comprendere che l'astrazione dei dati non viene avviata fino a quando non si ottengono istruzioni multi-bit (in genere byte). Immagino sia ovvio ora che lo dico, ma è una rivelazione. –

-2

spiegato per principianti

Dalla terra in su un computer ha un sacco di 'switch'. Ad esempio, una luce a LED può essere spenta
o su, ci sono solo 2 opzioni (1 = on o 0 = off). Se si dispone di 2 LED, è possibile spegnere il LED 1 e
2 e viceversa oppure attivarli o disattivarli. Ora ci sono più possibilità.

È possibile calcolare quante diverse possibilità ci sono.
1 lampada = 2^= 2 possibilità
2 lampade = 2^= 4 possibilità
8 lampade = 2^= 256 possibilitá

Così il computer legge da zero solo di e uno. Un computer ha molti interruttori a seconda della capacità della CPU. Per dire al computer di attivare una lampada è necessario aggiungere 0 e 1 nel sistema e questo sarebbe un compito molto difficile. Per evitare ciò hanno convertito le possibilità in numeri esadecimali. Assembly è solo un linguaggio per computer che convertirà le lettere digitate in 0 e 1 (codice binario) e seguirà le istruzioni.

6

Come me, sembri essere curioso di sapere come funzionano i computer sotto il cofano. Non so abbastanza per rispondere bene alle tue domande (ed è comunque un argomento importante), ma consiglio vivamente la serie di podcast "Let's Design a Computer" di Steve Gibson. Ecco un estratto dalla trascrizione "Linguaggio della macchina", per darti un assaggio. . .

E tutti i metodi di salto sono, invece di aggiungerne uno al contatore del programma, ne aggiungiamo due, o ne aggiungiamo uno due volte, che è in realtà il modo in cui funzionavano allora queste macchine. E questo ci fa semplicemente saltare un salto. Quindi, in sostanza, questo significa che possiamo ramificarci ovunque desideriamo in memoria o continuare sulla nostra strada, il che ci dà, anche se è molto semplice, che ci dà abbastanza potere per consentire alle macchine di prendere decisioni. E abbiamo input/output; abbiamo matematica; abbiamo la possibilità di trasferire dati da una posizione in memoria a un'altra. Questi sono tutti gli elementi essenziali del funzionamento di una macchina. Questo è il linguaggio macchina.

Ora, l'unico strato di umanità che viene messo sopra è quello che viene chiamato "linguaggio assembly", che non è altro che nominare le cose. Ad esempio, si crea una specie di cosiddetto mnemonico per le diverse istruzioni. Quindi, ad esempio, caricare l'accumulatore sarebbe LDA. Conservare l'accumulatore, STA. Vuoi che siano corti perché li stai digitando molto. Ricorda che finisci con l'usare tante piccole istruzioni per fare qualcosa. E poi l'unica altra cosa che fa il linguaggio assembly, ti permette di nominare le posizioni nella memoria.

Quindi, ad esempio, si potrebbe dire LDA, per accumulatore di carico, punteggio corrente. E il punteggio corrente si riferirebbe semplicemente a, come una variabile essenzialmente, una posizione in memoria che avevi etichettato come "punteggio attuale". E poi se hai fatto STA, accumula accumulatore, nuovo punteggio, beh, per prima cosa carica il punteggio corrente nell'accumulatore e poi lo memorizza in una posizione diversa chiamata nuovo punteggio. Quindi questo è tutto ciò di cui stiamo parlando sono alcune semplici abbreviazioni per aiutare a ricordare e usare queste istruzioni individuali e le etichette convenienti per le posizioni nella memoria in modo che non sia necessario ricordare, oh, questo è in posizione 329627. Voglio dire, chi può farlo? Quindi, invece, solo tu etichetti quella posizione con un inglese, una frase alfanumerica di qualche tipo, e poi ti riferisci a quella posizione con la frase piuttosto che con il suo numero effettivo.

E infatti non ti interessa quale sia il numero. Questa è una delle cose che l'assemblatore farà per te è che dici che ho bisogno di memoria chiamato queste cose. E si preoccupa di dove vanno, perché non ha importanza per te, a patto che vengano costantemente citati. E questo è l'intero processo. Questo è il linguaggio della macchina e il linguaggio dell'assemblaggio. E così avvenne 50 anni fa, e più o meno così è ora.

. .ma fa ancora più indietro e inizia con transistor e porte logiche. Da quello che posso dire, ecco la serie completa (e il pubblico l'ascolto ha contribuito diagrammi utile nel wiki):

Se qualcuno se la prende con qualsiasi cosa Steve dice in questi episodi, i posti migliori per fornire un feedback sono http://www.grc.com/feedback.htm o http://www.grc.com/discussions.htm o https://twitter.com/SGgrc