Sehen Sie sich zuerst Aganjus Kommentar unter der Frage an.
Nun, wie der Computer das nachvollziehen kann, kann ich Ihnen mein Wissen aus der 16-Bit-Programmierung vermitteln. Die Konzepte sind wahrscheinlich gleich. (Die genaue Antwort könnte jedoch von der Implementierung abhängig sein. Mit anderen Worten, die Leute, die die Chips entwerfen, könnten zumindest theoretisch andere Entscheidungen darüber treffen, wie sie funktionieren.)
Wenn Sie zwei Zahlen hinzufügen, die aus 8 Bit bestehen, ist dies die größte Zahl, die Sie erhalten können (0xFF + 0xFF = 1FE). Wenn Sie zwei 8-Bit-Zahlen multiplizieren, ist die größte Zahl (0xFF * 0xFF = 0xFE01) immer noch 16 Bit, zweimal 8 Bit.
Nun können Sie davon ausgehen, dass ein 8-Bit-Prozessor nur 8-Bit verfolgen kann. Das stimmt nicht. 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: Die MUL-Anweisung
Byte # 2: Die höherwertigen Bytes (z. B. 0xA5)
Byte # 3: Die niederwertigen Bytes (z. B. 0xCB)
Der Computer kann ein Ergebnis generieren ist mehr als 8 Bit. Die CPU kann Ergebnisse wie folgt generieren:
0100 0000 0100 0010 xxxx xxxx xxxx xxxx 1101 0111
alias:
0x4082xxxxD7
Nun lassen Sie mich das für Sie interpretieren:
0x bedeutet nur, dass die folgenden Ziffern hexadezimal sind.
Ich werde kurz auf die "40" eingehen.
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.
D7 würde in mehr Bits passen, die als "
Ein Register ist nur ein Stück Erinnerung. In den CPUs sind Register integriert, sodass die CPU auf Register zugreifen kann, ohne mit dem Speicher eines RAM-Sticks interagieren zu müssen.
Das mathematische Ergebnis von 0xA5-mal 0xCB ist also 0x82D7.
Warum wurden die Bits in die Register A und D anstatt in die Register A und B oder in die Register C und D aufgeteilt? Nun, dies ist wieder ein Beispielszenario, das ich verwende, und dessen Konzept einer realen Assembly-Sprache (Intel x86 16-Bit, wie sie von Intel 8080 und 8088 und vielen neueren CPUs verwendet wird) ziemlich ähnlich ist. Es kann einige allgemeine Regeln geben, beispielsweise das "C" -Register, das normalerweise als Index für Zähloperationen (typisch für Schleifen) verwendet wird, und das "B" -Register, das zum Nachverfolgen von Offsets verwendet wird, die dabei helfen, Speicherorte anzugeben. So können "A" und "D" für einige der üblichen Rechenfunktionen häufiger sein.
Jede CPU-Anweisung sollte über eine Dokumentation verfügen, die von Personen verwendet wird, die in Assembly programmieren. Diese Dokumentation sollte angeben, welche Register von den einzelnen Anweisungen verwendet werden. (Die Auswahl der zu verwendenden Register wird daher häufig von den Entwicklern der CPU festgelegt, nicht von den Programmiersprachen der Assembly-Sprache. Es kann jedoch eine gewisse Flexibilität geben.)
Zurück zur "40" im obigen Beispiel: Dies ist eine Reihe von Bits, die oft als "Flags-Register" bezeichnet wird. Jedes Bit im Flag-Register hat einen Namen. Beispielsweise gibt es ein "Überlauf" -Bit, das die CPU setzen kann, wenn das Ergebnis größer ist als der Platz, der ein Byte der Ergebnisse speichern kann. (Das "Überlauf" -Bit kann oft mit dem abgekürzten Namen "OF" bezeichnet werden. Dies ist ein Großbuchstabe, keine Null.) Die Software kann den Wert dieses Flags prüfen und das "Problem" feststellen. Das Arbeiten mit diesem Bit wird von unsichtbaren Sprachen oft unsichtbar behandelt. Anfänger lernen daher nicht, wie sie mit den CPU-Flags interagieren. Assembly-Programmierer können jedoch häufig auf einige dieser Flags in einer Weise zugreifen, die anderen Variablen sehr ähnlich ist.
Beispielsweise haben Sie möglicherweise mehrere ADD-Anweisungen. Ein ADD-Befehl kann 16 Ergebnisbits im A-Register und im D-Register speichern, während ein anderer Befehl die 8 niedrigen Bits im A-Register speichert, das D-Register ignoriert und das Überlaufbit spezifiziert. Später (nach dem Speichern der Ergebnisse des A-Registers im Haupt-RAM) könnten Sie dann einen anderen ADD-Befehl verwenden, der nur die 8 High-Bits in einem Register speichert (möglicherweise das A-Register). Ob Sie möglicherweise ein Überlaufflag verwenden müssen hängen Sie davon ab, welche Multiplikationsanweisung Sie verwenden.
(Normalerweise gibt es auch eine "Unterlauf" -Markierung, falls Sie zu viel subtrahieren, um in das gewünschte Ergebnis zu passen.)
Nur um Ihnen zu zeigen, wie kompliziert die Dinge wurden:
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 namens EAX, EBX, ECX und EDX.
Die Intel x64-CPUs verfügen über 64-Bit-Register mit den Namen RAX, RBX, RCX und RDX.
Die x64-Chips können (in einigen Betriebsarten) 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, die Hälfte der Bits, aus denen das RAX-Register besteht. Jedes Mal, wenn Sie den Wert von AX ändern, ändern Sie auch EAX und RAX, da die von AX verwendeten Bits zu den von RAX verwendeten Bits gehören.
Es gibt mehr Flaggen und Register als nur die, die ich erwähnt habe.
Wenn Sie sich auf einer 8-Bit-CPU befinden, können Sie beim Schreiben in den Speicher möglicherweise Einschränkungen hinsichtlich der Adresse von 8-Bit-Adressen feststellen, nicht von 4-Bit- oder 16-Bit-Adressen. Die Details variieren je nach CPU. Wenn Sie jedoch über solche Einschränkungen verfügen, kann es sich bei der CPU um 8-Bit-Wörter handeln, weshalb die CPU meistens als "8-Bit-CPU" bezeichnet wird.