it-swarm.com.de

Wie funktioniert der Ganzzahlvergleich intern?

Z.B. beim Vergleich zweier Ganzzahlen in einer C-ähnlichen Sprache wie folgt:

if (3 > 2) {
    // do something
}

Wie wird intern beurteilt, ob 3 größer als 2 (wahr) ist oder nicht (falsch)?

18
Niek

Den ganzen Weg das Kaninchenloch hinunter, was? OK, ich werde es versuchen.

Schritt 1. Von C zur Maschinensprache

Der C-Compiler transformiert Ihren Vergleich in in Maschinensprache gespeicherte Opcodes . Maschinensprache ist eine Reihe von Zahlen, die die CPU als Anweisungen interpretiert. In diesem Fall gibt es zwei Opcodes: "Mit Übertrag subtrahieren" und "Mit Übertrag springen". Mit anderen Worten, 2 wird in einem Befehl von 3 subtrahiert, und der nächste Befehl prüft, ob er übergelaufen ist. Diesen würden zwei Anweisungen vorangestellt, um die Nummern 2 und 3 an Stellen zu laden, an denen sie verglichen werden können.

MOV AX, 3    ; Store 3 in register AX
MOV BX, 2    ; Store 2 in register BX
SUB AX, BX   ; Subtract BX from AX
JC  Label    ; If the previous operation overflowed, continue processing at memory location "Label"

Jedes der oben genannten hat eine binäre Darstellung; Der Code für SUB lautet beispielsweise 2D hex oder 00101101 in binär.

Schritt 2. Opcodes zu ALU

Arithmetische Opcodes wie ADD, SUB, MUL und DIV führen grundlegende ganzzahlige Berechnungen mit einem ALU oder Arithmetic Logic Unit durch in die CPU. Zahlen werden von einigen Opcodes in Registern gespeichert; Andere Opcodes weisen den Chip an, die ALU aufzurufen, um zu berechnen, was gerade in den Registern gespeichert ist.

Hinweis: An diesem Punkt sind wir weit über alles hinaus, worüber sich ein Softwareentwickler Sorgen machen würde, wenn er mit einem GL wie C arbeitet.

Schritt 3. Die ALU, der Halbaddierer und der Volladdierer

Wussten Sie, dass alle mathematischen Operationen, die Sie kennen, auf eine Reihe von NOR Operationen reduziert werden können? Und genau so funktioniert die ALU.

Die ALU kann nur mit Binärzahlen arbeiten und kann nur logische Operationen wie OR, NOT, AND und XOR ausführen. Die Implementierung der binären Addition und Subtraktion erfolgt mit einer Reihe von logischen Operationen, die auf eine bestimmte Weise angeordnet sind, in einem Subsystem, das als Addierer bekannt ist. Diese Subsysteme bestehen aus einem Netzwerk von "Halbaddierern", die mit zwei Bits arbeiten und ihre Einzelbit-Summe und ein Einzelbit-Übertragsflag bestimmen. Durch Verketten dieser kann die ALU Operationen an Zahlen mit 8, 16, 32 usw. Bits ausführen.

(Half-Adder

Was ist mit Subtraktion? Subtraktion ist nur eine andere Form der Addition:

A - B = A + (-B)

Die ALU berechnet -B indem man das Zweierkomplement von B nimmt. Sobald es in ein Negativ umgewandelt wurde, führt das Senden des Werts an den Addierer zu einer Subtraktionsoperation.

Schritt 4: Der letzte Schritt: On-Chip-Transistoren

Die Operationen der Addierer werden unter Verwendung einer Kombination von elektrischen Komponenten implementiert, die interagieren, um "Logikgatter" zu erzeugen, wie sie in Transitor-Transistor-Logik oder TTL oder in [~ # ~) zu finden sind ] cmos [~ # ~] . Klicken Sie auf hier , um einige Beispiele zu sehen, wie diese verkabelt sind.

Auf einem Chip sind diese "Schaltkreise" natürlich in Millionen winziger Teile leitfähigen und nicht leitenden Materials implementiert, aber das Prinzip ist dasselbe, als wären sie Komponenten voller Größe auf einem Steckbrett. Sehen Sie sich dieses Video an , das Ihnen alle Transistoren eines Mikrochips durch die Linse eines elektronischen Mikroskops zeigt.

Einige zusätzliche Hinweise:

  1. Der von Ihnen geschriebene Code wird vom Compiler tatsächlich vorberechnet und nicht zur Laufzeit ausgeführt, da er ausschließlich aus Konstanten besteht.

  2. Einige Compiler kompilieren nicht mit Maschinencode, sondern führen eine weitere Ebene ein, z. B. Java Bytecode oder .NET-Zwischensprache. Am Ende wird jedoch alles über Maschinensprache ausgeführt.

  3. Einige mathematische Operationen werden nicht berechnet. Sie werden in massiven Tabellen auf einer arithmetischen Kopiereinheit nachgeschlagen oder enthalten eine Kombination aus Nachschlagen und Berechnen oder Interpolieren. Ein Beispiel wäre die Funktion zum Berechnen einer Quadratwurzel . Moderne PC-CPUs verfügen jeweils über eine Gleitkomma-Verarbeitungseinheit, die in jeden CPU-Kern eingebaut ist.

61
John Wu