2013-06-24 7 views
7

Ich habe vor kurzem einen Digital Logic Kurs besucht und alles über UND, ODER und verschiedene andere Arten von Logik gelernt. Eine Sache, die wir nicht behandelt haben, was für die Programmierung absolut notwendig ist, ist if Aussagen und es hat mich ziemlich neugierig gemacht, wie sie funktionieren.Was ist eine "if" Aussage auf der Ebene von Transistoren?

Meine beste Vermutung ist, dass es einfach ein 2: 1-Multiplexer wäre, und wie Sie weitere else Aussagen hinzufügen, wird es 4: 1 und 8: 1, aber das scheint ein wenig zu komplex für solch ein einfaches Konzept.

Wer weiß, was eine if Aussage tatsächlich übersetzt?

+0

Große Frage! komplizierte Antwort. Sie müssen sehen, dass es geschieht, um es vollständig zu verstehen, ich empfehle Ihnen, ein einfaches Beispiel zu schreiben, es zu kompilieren, es mit einem Debugger zu verbinden und es nacheinander zu lesen. – Wug

+0

@wug das ist eine großartige Idee, danke. – Nealon

Antwort

1

Sie vergessen, dass die Programme als einzelne Befehle ausgeführt werden, und (zumindest im einfachsten Fall) Befehle ausführen nacheinander.

Also für if (a + 4 > 5) eine Anweisung a in ein Register geladen wird, wird ein anderer Befehl 4 hinzufügen, wird ein anderer Befehl die Summe zu 5 vergleichen. Dann testet ein Befehl den "Bedingungscode" aus dem Vergleich und führt entweder den unmittelbar folgenden Befehl aus (Ausführen des "if Körpers") oder springt zu einem Ort im Speicher mehrere (oder mehrere Dutzend) Anweisungen weg (überspringt den " if Körper ").

Da ist digitale Logik drin, aber es ist auf einer niedrigeren Ebene und entscheidet darüber, wie jeder einzelne Befehl ausgeführt wird.

+0

naja, das ist nicht annähernd so aufregend ... verdammt. Danke, obwohl – Nealon

+0

@Nealon - Es gibt Computer, die viel "näher an das Silikon" bekommen. Ich arbeitete an einem, wo die Auswahl des nächsten Befehls von einem programmierbaren Logik-Array gesteuert wurde - im Wesentlichen ein massives AND/OR-Array. Setze die Bedingungen ein und hole die nächste Befehlsadresse heraus, und die Wahl könnte zwischen 10-20 verschiedenen "Verzweigungszielen" liegen, wenn das sinnvoll ist. –

+0

Ja, wir haben auch in dieser Klasse von PLA gelernt. Das ist interessant, aber ich habe wirklich gehofft, dass es interessanter ist. Es ist im Wesentlichen (und ich weiß, dass ich es wahrscheinlich verdummte) eine Menge "Goto" -Aussagen, richtig? – Nealon

1

Eine richtige if Aussage übersetzt, um etwas ein bisschen höhere Ebene als Transistor-Logik. if Anweisungen werden im Allgemeinen als bedingte Verzweigungen implementiert (unter der Annahme, dass keine Optimierungen vorgenommen werden), indem entweder der Programmzähler um den Standardwert erhöht oder auf den im Zweig angegebenen Wert gesetzt wird, abhängig davon, ob die Bedingung als wahr oder falsch ausgewertet wurde (normalerweise 1 oder 0).

0

if ist ein Steuerflussbetrieb innerhalb einer Programmiersprache, kein Konzept ausdrückbar in digitaler Logik. Wenn Ihre Klasse die Maschinen mit Assembleranweisungen wie jump abgedeckt (ich bin mir nicht sicher, dass ich das jemals gelernt habe), ist das eine Aussage aus if gemacht.

-1

Wie die anderen oben erwähnten, gibt es logische Vergleicher, die diese Entscheidungen letztlich treffen. Es gibt eine Menge verschiedener Implementierungen von Komparatoren, abhängig von den Designanforderungen (Leistung, Fläche, Schwung, getaktet oder nicht, ect.). Die Komparatoren bestehen aus einer Anzahl von CMOS-NMOS/CMOS-Gattern.

Schauen Sie auf der Wikipedia-Seite nach Komparatoren und schauen Sie sich den dynamischen Komparator an. Ich habe nicht genug Rep, um einen leider zu posten.

Dies ist ein Beispiel für einen dynamischen verriegelten Komparator. Abhängig davon, ob die Implementierung hoch oder niedrig ist, würde das System hier die Architektur takten, um zwei Werte zu vergleichen und die Aussage zu bewerten.

1

Es ist eine Weile her, dass ich eine Computerarchitektur Klasse genommen haben, mir so verzeihen, wenn ich etwas vage mit dieser Antwort bin.

Alle Anweisungen, die den Computer kommt aus dem Befehlsspeicher ausführt, und ich glaube, dass eine Reihe gibt es die Adresse des Befehls darstellt auszuführen.

Die typische Anweisung hat mehrere Abschnitte, 1 für den Befehlscode und normalerweise Abschnitte für bis zu 2 Quellregister, das Zielregister und einige andere Dinge, über die ich seit über 4 Jahren nicht nachdenken musste.

Wie auch immer, einer der Befehlscodes ist normalerweise ein bedingter Sprung, und wenn Sie verstehen können, wie Ihr Datenpfad Werte im regulären RAM speichert/abruft, sollte es nicht so schwer sein, diese Logik zu erweitern Befehlsadresse entweder zu einem literalen Wert oder den Wert in einem bestimmten Register gespeichert sind, basierend darauf, ob ein anderes Literalwert/Registerwert gleich 0

enter image description here

1

If-Anweisungen, und alle anderen Steuerablaufanweisungen sind auf der Logikebene als bedingte Sprünge implementiert.

Wenn Sie eine if-Anweisung, wie diese:

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

Offensichtlich jeder Smart-Compiler dies heraus optimieren. Wenn wir speziell unsere Compiler anweisen, so dumm wie möglich zu sein und Anweisungen wörtlich zu generieren, werden wir so etwas wie die folgenden aus ihm heraus:

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 

Diese Montageanleitung sind, von denen jede (grob) werden direkt auf Maschinencode-Opcodes. Der Prozessor macht eine Menge zusätzlicher Dinge, um den Prozess des Ladens und Abrufens von Befehlen zu unterstützen, was hier relevant ist. Es gibt ein spezielles Register, das Programmzähler (später als PC-Register bezeichnet), das den Ort des nächsten Opcodes verfolgt, den der Prozessor ausführen wird.

  1. Zuerst subtrahiert der CMP-Befehl den zweiten Operanden vom ersten und verwirft das Ergebnis. Das FLAGS-Register wird jedoch mit den Ergebnissen der arithmetischen Operation aktualisiert.
  2. Dann prüft der JG-Befehl, ob das GREATER-Flag im FLAGS-Register gesetzt ist. Da es sich in unserem Beispiel um 1 handelt, rufen Sie einen Sprung auf.
  3. Der Sprungbefehl ändert den Programmzähler (PC), der das Register ist, von dem aus die CPU den nächsten Befehl liest.
  4. Die CPU versucht dann, den nächsten Befehl zu lesen. Da wir gesprungen sind, folgt die nächste Anweisung nicht unmittelbar auf die zuvor bearbeitete.

Das ist ein Überblick über den Prozess. Wenn Sie eine ausführlichere Erklärung wünschen, empfehle ich Ihnen, ein einfaches C-Programm mit einer if-Anweisung zu schreiben, zu kompilieren, zu disassemblieren (mit Linux objdump oder einem Äquivalent) und vielleicht einen Debugger anzuhängen und auszuführen.

linux objdump manual

die nächste Anweisung anzuzeigen, display/i $pc

1

verwenden in gdb ausgeführt werden, wenn Sie nur besorgt sind dann die, wenn die Bedingung der Durchführung seiner einfachen,

Sie haben wahrscheinlich digital gelesen Design von Morris Mano, dort ist eine einfache Schaltung zum Vergleich zweier Register gegeben, übrigens ist die Logik einfach, wenn Sie darüber nachdenken.

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

Nun, wenn Sie sind besorgt darüber, wie die if-Anweisung, dass, wie es tatsächlich in dem CPU implementiert ist dann geht es durch den 3-Schritt-Zyklus von Fetch, Decode und Ausführen.

Danach werden die Register wie zuvor beschrieben verglichen.

Hoffe es hilft .. :)

+0

Das war mehr eine Frage der Dunkelheit, und es wurde vor einer Weile beantwortet, danke aber. – Nealon