Wie interpretiert ein 8-Bit-Computer oder eine "CPU" Zahlen größer als 255?

3318
CosnotraLF

Ok, also habe ich danach gesucht, aber ich finde anscheinend nichts, was damit zu tun hat.
Was ich weiß ist, dass der Computer einen neuen Speicherblock von 8 Bits ( 1 Byte ) verwendet, um die große Zahl zu speichern, wenn die Zahl größer als 255 ist .

Nehmen wir an, ich möchte, dass der Computer 255 + 7 hinzufügt . Das würde mir 262 in Basis 10 geben, aber in binär müsste es sein:

00 00 <- vor
01 06 <- danach
(dies ist in hexadezimaler Form übrigens)

Wie würde der Computer diese 2 Bytes zurück zur Basis- 10- Form / Dezimal-Form decodieren, wenn der Computer nicht 6 und 256 hinzufügen kann, da 255 die höchste Zahl ist, die er hinzufügen kann. Wie würde der Computer diese 2- Byte-Antwort / Ergebnis als 262 auf dem Bildschirm anzeigen lassen?

-2
Es muss nie 262 werden, um so dargestellt zu werden. Es muss die erste Ziffer, eine '2', dann die zweite Ziffer usw. berechnet werden. Jede Ziffer kann berechnet werden, wenn Sie unter 255 bleiben. Aganju vor 7 Jahren 0
Vielen Dank! Das hilft sehr viel! (; aber wie würde es die erste Ziffer a 2, die zweite a 6 und die letzte a 2 berechnen, um 262 zu bilden? Wie kann man diese Zahlen mit den 2 Bytes berechnen, die der Computer im Speicher speichert. Natürlich in binär, da Computer 10 / Dezimalstellen nicht verstehen können CosnotraLF vor 7 Jahren 0
BEARBEITEN: Da die zwei Bytes: 01 und 06 sind, sagen wir, der Computer interpre- tiert die linke als 256 und die rechte als 6, wenn er versucht, sie auf den Bildschirm zu schreiben, würde er wie folgt aussehen: .. 2566 was ist nicht gleich 262, natürlich ist es eine kompliziertere Berechnung, aber ich möchte wissen, wie die Berechnung durchgeführt wird, damit ich sie auf einem 8-Bit-Computer implementieren kann, den ich gerade mache. CosnotraLF vor 7 Jahren 0
Dies wird [binäre in dezimale Konvertierung mit begrenzter Genauigkeit] (http://homepage.cs.uiowa.edu/~jones/bcd/decimal.html) genannt. Eines der Beispiele ist das Konvertieren einer 16-Bit-Nummer (genau wie Ihre 0106) ) mit nur 8-Bit-ALU auf Dezimalstellen Martheen Cahya Paulo vor 7 Jahren 0
Ich habe nicht dein ganzes q gelesen, ich mache jetzt etwas gleichzeitig, aber denk daran, dass du theoretisch über 9 oder 10 hinaus zählen kannst, obwohl du nur 10 Finger hast. barlop vor 7 Jahren 0
@Mattheen thx ich bin Finna, lese dies dann gehe ich zu den nächsten Antworten. CosnotraLF vor 7 Jahren 0
@Marthewn Cahyda Paulo DIE BESTE ANTWORTEN BRO ICH ENDLICH ENDE! Vielen Dank CosnotraLF vor 7 Jahren 0

1 Antwort auf die Frage

3
TOOGAM

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.

Sehr hilfreich! +10000 CosnotraLF vor 7 Jahren 0