2013-06-24 18 views
7

Recentemente ho seguito un corso di Digital Logic e ho imparato tutto su AND, OR e vari altri tipi di logica. Una cosa che non abbiamo trattato, che è assolutamente essenziale per la programmazione, è le dichiarazioni if e mi ha lasciato piuttosto curioso di sapere come funzionano.Che cos'è un'istruzione "if" a livello di transistor?

La mia ipotesi migliore è che sarebbe semplicemente un multiplexer 2: 1, e come si aggiungono altre affermazioni else diventa 4: 1 e 8: 1 ma sembra un po 'troppo complesso per un concetto così semplice.

Qualcuno sa che cosa si traduce effettivamente in una dichiarazione if?

+0

Grande domanda! risposta complicata però. Hai bisogno di vedere che capita di capirlo completamente, ti consiglio di scrivere un semplice esempio, compilarlo, collegarlo ad un debugger e passarlo attraverso, un'istruzione alla volta. – Wug

+0

@wug è un'ottima idea, grazie. – Nealon

risposta

1

Stai dimenticando che i programmi vengono eseguiti come istruzioni individuali e (almeno nel caso più semplice) le istruzioni vengono eseguite in sequenza.

Così, per if (a + 4 > 5) un'istruzione caricherà a in un registro, un'altra istruzione aggiungerà 4, un'altra istruzione confronterà la somma da 5. Quindi un'istruzione testerà il "codice condizionale" dal confronto e eseguirà l'istruzione immediatamente successiva (eseguendo il "if body") o "salterà" in una posizione in memoria diverse (o diverse dozzine) di istruzioni (saltando sopra il " if corpo ").

C'è una logica digitale, ma è a un livello inferiore, che decide come eseguire ogni singola istruzione.

+0

beh, non è nemmeno così eccitante ... dannatamente. Grazie però – Nealon

+0

@Nealon - Ci sono computer che diventano molto "più vicini al silicone". Ho lavorato su uno in cui la selezione dell'istruzione successiva era controllata da un array di logica programmabile, essenzialmente un enorme array AND/OR. Inserisci le condizioni e ottieni il prossimo indirizzo di istruzioni, e la scelta potrebbe essere tra 10-20 diversi "obiettivi di branca", se ciò avesse senso. –

+0

sì, abbiamo imparato a conoscere il PLA anche in quella classe. È interessante, ma speravo davvero che fosse più interessante. È essenzialmente (e so che probabilmente sto sminuendo) un sacco di dichiarazioni 'goto', giusto? – Nealon

1

Una corretta istruzione if si traduce in qualcosa di un livello un po 'più alto della logica del transistor. Le istruzioni if vengono generalmente implementate come rami condizionali (supponendo che non vi siano ottimizzazioni), incrementando il contatore del programma per l'importo predefinito o impostandolo sul valore specificato nel ramo in base al fatto che la condizione valutata su true o false (in genere 1 o 0).

0

if è un'operazione di flusso di controllo all'interno di un linguaggio di programmazione, non un concetto espressivo in logica digitale. Se la tua classe copriva il macchinario associato alle istruzioni di assemblaggio come jump (non sono sicuro di averlo mai imparato), questo è ciò che fa una dichiarazione if.

-1

Come già affermato in precedenza, ci sono dei comparatori logici che alla fine prendono queste decisioni. Ci sono un sacco di diverse implementazioni di comparatori a seconda delle esigenze di progettazione (potenza, area, swing, clock o non, ecc.). I comparatori sono costituiti da un numero di porte CMOS NMOS/CMOS.

Cerca la pagina di wikipedia per i comparatori e guarda il comparatore con latch dinamico. Non ho abbastanza rep per postarne uno sfortunatamente.

Questo è un esempio di un comparatore a chiusura dinamica. A seconda che l'implementazione sia attiva alta o bassa, il sistema eseguirà il clock dell'architettura per confrontare due valori e valutare l'istruzione.

1

È passato un po 'di tempo da quando ho frequentato un corso di architettura informatica, quindi scusami se sono un po' vago con questa risposta.

Tutte le istruzioni che il computer esegue provengono dalla memoria delle istruzioni e credo che sia presente un numero che rappresenta l'indirizzo dell'istruzione da eseguire.

l'istruzione tipica ha più sezioni, 1 per il codice di comando e normalmente sezioni per un massimo di 2 registri sorgente, il registro di destinazione e alcune altre cose a cui non ho dovuto pensare per oltre 4 anni.

In ogni caso, uno dei codici di comando è normalmente un salto condizionato e Se è possibile capire come il percorso dei dati memorizza/recupera i valori nella ram normale, non dovrebbe essere così difficile estendere tale logica per modificare il indirizzo istruzione per un valore letterale, o il valore memorizzato in un registro particolare, in base a se un altro valore letterale valore/registro è uguale a 0

enter image description here

1

If, e tutte le altre istruzioni di controllo del flusso, sono implementato a livello logico come salti condizionali.

Quando si utilizza un'istruzione if, come questo:

int a = 1, b = 0 
if (a > b) 
{ 
    ... 

Ovviamente, qualsiasi compilatore intelligente ottimizzare questo fuori. Se noi insegniamo specificamente il nostro compilatore di essere stupidi come possibile e generare istruzioni alla lettera, avremo qualcosa di simile al seguente fuori di esso:

my_if_statement: 
    CMP eax, ebx # intrinsically works by subtracting ebx from eax 
         # eax and ebx are not changed, but the arithmetic flags are 

         # if it was greater, jump to greater label 
    JG my_if_statement_was_true 

         # if it wasn't greater, we get here 
my_if_statement_was_false: 
         # do something 
         # we're now done, so jump to the end of the statement 
    J  my_if_statement_end 

my_if_statement_was_true: 
         # do something else 
         # now we're done with the if statement 
my_if_statement_end: 
         # program continues 

Queste sono le istruzioni di montaggio, ognuno dei quali traducono (circa) direttamente al codici operativi del codice macchina. Il processore fa un mucchio di cose aggiuntive per supportare il processo di caricamento e recupero delle istruzioni, che è rilevante qui. C'è un registro speciale chiamato contatore del programma (indicato più avanti come registro PC), che tiene traccia della posizione del prossimo codice operativo che il processore sta per eseguire.

  1. Prima, l'istruzione CMP sottrae il secondo operando dal primo e scarta il risultato. Tuttavia, il registro FLAGS viene aggiornato con i risultati dell'operazione aritmetica.
  2. Quindi, l'istruzione JG controlla se è impostato il flag GREATER nel registro FLAGS. Dato che è nel nostro esempio (ricorda che 1> 0), esegue un salto.
  3. L'istruzione di salto modifica il contatore del programma (PC), che è il registro che controlla da dove la CPU leggerà l'istruzione successiva da.
  4. La CPU tenta quindi di leggere l'istruzione successiva. Da quando siamo saltati, l'istruzione successiva non è quella immediatamente successiva a quella precedentemente elaborata.

Questa è una panoramica del processo. Se vuoi una spiegazione più approfondita, ti consiglio di scrivere un semplice programma C con un'istruzione if, compilarlo, disassemblarlo (usando linux objdump o un equivalente), e magari aggiungere un debugger ad esso ed eseguirlo.

linux objdump manual

Per mostrare la prossima istruzione da eseguire in gdb, utilizzare display/i $pc

1

Se sono solo preoccupati per l'attuazione del se la condizione allora, la sua semplice,

probabilmente hanno letto digitale design di Morris Mano, esiste un semplice circuito per confrontare due registri, a proposito, la logica è semplice se ci si pensa a questo.

a>b OR a<b OR a==b all these 3 instructions can be implemented easily 
    by just comparing the two registers 

Ora, se siete preoccupati per come l'istruzione if, che come in realtà si è implementato nel CPU poi si passa attraverso il ciclo 3 step di Fetch, decodificare e Execute.

Successivamente i registri vengono confrontati come detto in precedenza.

Spero che aiuti .. :)

+0

Questa era più semplicemente una domanda di oscurità, ed è stata data risposta qualche tempo fa, grazie comunque. – Nealon