Der größte Teil des Inhalts dieser Antwort stammte ursprünglich aus dieser Antwort (geschrieben, bevor diese andere Frage als Duplikat markiert wurde). Ich diskutiere also die Verwendung von 8-Bit-Werten (obwohl diese Frage zu 32-Bit-Werten gestellt wurde), aber das ist in Ordnung, da 8-Bit-Werte konzeptionell einfacher zu verstehen sind und die gleichen Konzepte für größere Werte wie 32-Bit-Arithmetik gelten.
Wenn Sie zwei 8-Bit-Zahlen hinzufügen, erhalten Sie die größte Zahl (0xFF + 0xFF = 1FE). Wenn Sie zwei 8-Bit-Zahlen multiplizieren, beträgt die größte Zahl, die Sie erhalten können (0xFF * 0xFF = 0xFE01), immer noch 16 Bit, zweimal 8 Bit.
Nun können Sie davon ausgehen, dass ein x-Bit-Prozessor nur x-Bits verfolgen kann. (Zum Beispiel kann ein 8-Bit-Prozessor nur 8 Bit verfolgen.) Das ist nicht korrekt. Der 8-Bit-Prozessor empfängt Daten in 8-Bit-Blöcken. (Diese "Chunks" haben normalerweise einen formalen Begriff: ein "Wort". Auf einem 8-Bit-Prozessor werden 8-Bit-Wörter verwendet. Auf einem 64-Bit-Prozessor können 64-Bit-Wörter verwendet werden.)
Wenn Sie dem Computer also 3 Bytes geben:
Byte 1: Der MUL-Befehl
Byte 2: Die Bytes höherer Ordnung (z. B. 0xA5)
Byte 3: Die Bytes niedrigerer Ordnung (z. B. 0xCB)
Der Computer kann ein Ergebnis erzeugen, das ist mehr als 8 Bits. Die CPU kann folgende Ergebnisse erzeugen:
0100 0000 0100 0010 xxxx xxxx xxxx xxxx 1101 0111
aka:
0x4082xxxxD7
Lassen Sie mich das jetzt interpretieren:
0x bedeutet nur, dass die folgenden Ziffern hexadezimal sind.
Ich werde die "40" kurz genauer besprechen.
82 ist Teil des "A" -Registers, das eine Reihe von 8 Bits ist.
xx und xx sind Teil von zwei anderen Registern, die als "B" -Register und "C" -Register bezeichnet werden. Der Grund, warum ich diese Bits nicht mit Nullen oder Einsen gefüllt habe, ist, dass ein "ADD" -Befehl (der an die CPU gesendet wird) dazu führen kann, dass diese Bits durch den Befehl unverändert bleiben (wohingegen die meisten anderen Bits, die ich in diesem Beispiel verwende, dies können geändert werden (mit Ausnahme einiger Flag-Bits).
D7 würde in mehr Bits passen, die als "D" -Register bezeichnet werden.
Ein Register ist nur ein Stück Erinnerung. In den CPUs sind Register eingebaut, so dass die CPU auf Register zugreifen kann, ohne mit dem Speicher auf einem RAM-Stick interagieren zu müssen.
Das mathematische Ergebnis von 0xA5 mal 0xCB ist also 0x82D7.
Warum wurden die Bits in die A- und D-Register anstelle der A- und B-Register oder der C- und D-Register aufgeteilt? Nun, noch einmal, dies ist ein Beispielszenario, das ich verwende und dessen Konzept einer echten Assemblersprache (Intel x86 16-Bit, wie es von Intel 8080 und 8088 und vielen neueren CPUs verwendet wird) ähnelt. Möglicherweise gibt es einige allgemeine Regeln, z. B. das "C" -Register, das normalerweise als Index für Zählvorgänge verwendet wird (typisch für Schleifen), und das "B" -Register, das zum Verfolgen von Offsets verwendet wird, mit denen Speicherorte angegeben werden können. So können "A" und "D" für einige der üblichen arithmetischen Funktionen üblicher sein.
Jeder CPU-Befehl sollte eine Dokumentation enthalten, die von Personen verwendet wird, die in Assembly programmieren. In dieser Dokumentation sollte angegeben werden, welche Register von den einzelnen Befehlen verwendet werden. (Die Auswahl der zu verwendenden Register wird daher häufig von den Entwicklern der CPU festgelegt, nicht von den Assembler-Programmierern. Es kann jedoch Flexibilität geben.)
Kommen wir nun zu "40" im obigen Beispiel zurück: Das ist eine Reihe von Bits, die oft als "Flags-Register" bezeichnet werden. Jedes Bit im Flags-Register hat einen Namen. Zum Beispiel gibt es ein "Überlauf" -Bit, das die CPU möglicherweise setzt, wenn das Ergebnis größer ist als der Speicherplatz, der ein Byte der Ergebnisse speichern kann. (Das "Überlauf" -Bit wird häufig mit dem abgekürzten Namen "OF" bezeichnet. Dies ist ein Großbuchstabe o, keine Null.) Die Software kann den Wert dieses Flags überprüfen und das "Problem" feststellen. Die Arbeit mit diesem Bit wird von höheren Sprachen häufig unsichtbar ausgeführt, sodass Programmieranfänger häufig nicht lernen, wie sie mit den CPU-Flags interagieren. Assembly-Programmierer greifen jedoch häufig auf einige dieser Flags zu, ähnlich wie bei anderen Variablen.
Zum Beispiel könnten Sie mehrere ADD-Anweisungen haben. Ein ADD-Befehl speichert möglicherweise 16 Bit der Ergebnisse im A-Register und im D-Register, während ein anderer Befehl möglicherweise nur die 8 niedrigen Bits im A-Register speichert, das D-Register ignoriert und das Überlaufbit angibt. Dann, später (nach dem Speichern der Ergebnisse des A-Registers in den Haupt-RAM), könnten Sie einen anderen ADD-Befehl verwenden, der nur die 8 hohen Bits in einem Register (möglicherweise dem A-Register) speichert hängt davon ab, welche Multiplikationsanweisung Sie verwenden.
(Es gibt auch häufig ein "Unterlauf" -Flag, falls Sie zu viel subtrahieren, um das gewünschte Ergebnis zu erzielen.)
Nur um Ihnen zu zeigen, wie kompliziert es wurde:
Der Intel 4004 war eine 4-Bit-CPU
Der Intel 8008 war eine 8-Bit-CPU. Es hatte 8-Bit-Register mit den Namen A, B, C und D.
Der Intel 8086 war eine 16-Bit-CPU. Es hatte 16-Bit-Register mit den Namen AX, BX, CX und DX.
Der Intel 80386 war eine 32-Bit-CPU. Es hatte 32-Bit-Register mit den Namen EAX, EBX, ECX und EDX.
Die Intel x64-CPUs haben 64-Bit-Register mit den Namen RAX, RBX, RCX und RDX. Die x64-Chips können (in einigen Betriebsmodi) 16-Bit-Code ausführen und 16-Bit-Anweisungen interpretieren. Dabei sind die Bits, aus denen das AX-Register besteht, die Hälfte der Bits, aus denen das EAX-Register besteht, also die Hälfte der Bits, aus denen das RAX-Register besteht. Wenn Sie also den Wert von AX ändern, ändern Sie auch EAX und RAX, da die von AX verwendeten Bits Teil der von RAX verwendeten Bits sind. (Wenn Sie den EAX um ein Vielfaches von 65.536 ändern, bleiben die niedrigen 16 Bits unverändert, sodass sich AX nicht ändert. Wenn Sie den EAX um einen Wert ändern, der kein Vielfaches von 65.536 ist, wirkt sich dies auch auf AX aus .)
Es gibt mehr Flaggen und Register als nur die, die ich erwähnt habe. Ich habe einfach einige häufig verwendete ausgewählt, um ein einfaches konzeptionelles Beispiel zu liefern.
Wenn Sie auf einer 8-Bit-CPU arbeiten und in den Speicher schreiben, können Sie möglicherweise Einschränkungen feststellen, wenn Sie auf eine Adresse mit 8 Bits verweisen möchten, nicht auf eine Adresse mit 4 Bits oder 16 Bits. Die Details variieren je nach CPU. Wenn Sie jedoch solche Einschränkungen haben, kann es sein, dass die CPU mit 8-Bit-Wörtern arbeitet. Aus diesem Grund wird die CPU am häufigsten als "8-Bit-CPU" bezeichnet.