it-swarm.com.de

Ist Maschinensprache immer binär?

Ich weiß absolut nichts über Low-Level-Sachen, daher wird dies eine sehr neue Frage sein. Bitte entschuldigen Sie meine Unwissenheit.

Ist die Maschinensprache - die Zahlenreihe, die dem physischen Computer genau sagt, was zu tun ist - immer binär? Das heißt, immer nur aus Nullen Eins Einsen zusammengesetzt? Oder könnte es auch aus Zahlen wie 101, 242, 4 usw. bestehen?

22
Aviv Cohn

Alles in einem Computer (genauer gesagt in einem typischen zeitgenössischen Computer) ist auf einer bestimmten Ebene binär. "1s and 0s" ist eine Abstraktion, eine Idee, mit der wir zwei Werte unterscheiden können. Im RAM bedeutet dies eine höhere und niedrigere Spannung. Auf der Festplatte bedeutet dies unterschiedliche magnetische Zustände und so weiter. Unter Verwendung der Booleschen Logik und eines Basis-2-Zahlensystems kann eine Kombination aus Einsen und Nullen eine beliebige Zahl darstellen, und andere Dinge (wie Buchstaben, Bilder, Töne usw.) können als Zahlen dargestellt werden.

Aber das meinen die Leute nicht, wenn sie "Binärcode" sagen. Das hat für Programmierer eine besondere Bedeutung: "Binärer" Code ist Code, der nicht in Textform vorliegt. Der Quellcode existiert als Text; es sieht aus wie ein hoch formalisiertes System aus englischen und mathematischen Symbolen. Die CPU versteht jedoch keine englische oder mathematische Notation. es versteht Zahlen. Der Compiler übersetzt also den Quellcode in einen Strom von Zahlen, die CPU-Anweisungen darstellen, die dieselbe zugrunde liegende Bedeutung wie der Quellcode haben. Dies ist eigentlich als "Maschinencode" bekannt, aber viele Leute nennen es "binär".

47
Mason Wheeler

Werfen wir einen Blick auf eine tatsächliche Maschinenanweisung. Angenommen, wir haben eine ARM CPU) und möchten dem Wert in Register 2 143 hinzufügen und das Ergebnis in Register 1 platzieren. In ARM Assemblersprache, die geschrieben wurde

ADD  R1, R2, #143

Diese Assembly-Anweisung kann als einzelne Maschinenanweisung codiert sein. Die Beschreibung, wie dies gemacht wird, finden Sie auf der physischen Seite 156 des ARM ARM , dem amüsant benannten Acorn RISC Machine Architecture Reference Manual. Es ist auch notwendig, die Definition des "Shifter-Operanden" zu betrachten, die auf der physischen Seite 444 beginnt.

 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
|    Cond   | 0  0  I  0  1  0  0  S|     Rn    |     Rd    |          shifter operand          |

Wie Sie anscheinend bereits verstanden haben, sind Maschinenanweisungen Zahlen, und auf dem ARM sind es Zahlen mit einer festen Größe: 32 Bit, die in mehrere Felder unterteilt sind. Um das obige ADD zu codieren, füllen wir die Felder wie folgt aus:

| cond | fmt | I | opcode | S | Rn | Rd | rot | imm |
|    E |  00 | 1 |  0100  | 0 | 2  | 1  | 0   | 143 |

(Der "Shifter-Operand" wurde in "rot" und "imm" unterteilt, weil ich I = 1 gesetzt habe.) Um dies zu einer einzelnen 32-Bit-Zahl zu machen, müssen wir sie auf binär erweitern, da viele der Felder sind nicht ordentlich viele Bits lang:

 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
  1  1  1  0  0  0  1  0  1  0  0  0  0  0  1  0  0  0  0  1  0  0  0  0  1  0  0  0  1  1  1  1

Für den Menschen ist das eine große Unschärfe. Hexadezimal ist für uns leichter zu verstehen:

1110  0010  1000  0010  0001  0000  1000  1111
   E     2     8     2     1     0     8     F

Und so sagen wir normalerweise in der Kommunikation mit anderen Menschen, dass die "Maschinenanweisung", die ADD R1, R2, #143 Entspricht, die Hexadezimalzahl E282 108F Ist. Wir könnten gleichermaßen sagen, dass es die Dezimalzahl Zahl 3.800.174.735 ist, aber das verdeckt das Muster der Felder mehr als hexadezimal. (Jemand mit viel Übung beim Debuggen auf dem Bare Metal auf ARM könnte Bedingungscode E, Quell- und Zielregister 2 und 1, Sofortoperand 8F = 143 aus E282 108F Relativ einfach.)

Alle obigen Darstellungen codieren dieselbe Maschinenanweisung! Ich habe nur geändert, wie ich sie aufgeschrieben habe.

In Bezug auf "Einsen und Nullen" erscheint, wenn Sie ein Programm mit dieser Anweisung in RAM auf einem realen Computer) laden, irgendwo im Speicher das Bitmuster 1110 0010 1000 0010 0001 0000 1000 1111 ( möglicherweise rückwärts wegen Endianness ). Aber es ist ebenso gültig zu sagen, dass irgendwo im Speicher die Hexadezimalzahl E282 108F oder die dekodierte Anweisung ADD R1, R2, #143 Wird angezeigt. Bitmuster in RAM haben an sich keine Bedeutung; die Bedeutung kommt aus dem Kontext. Umgekehrt ist dieses Bitmuster/diese Hexadezimalzahl nicht unbedingt eine Anweisung! Es würde auch in einem Programm erscheinen, das erstellt hat Verwendung der vorzeichenlosen 32-Bit-Ganzzahl 3.800.174.735 oder der IEEE-Gleitkommazahl -11.199634951 × 10 mit einfacher Genauigkeit21 as Daten.

25
zwol

Wenn jemand in den meisten Kontexten, insbesondere in diesem Kontext, den Ausdruck "Einsen und Nullen" verwendet, stellt er meiner Meinung nach die Vorgänge erheblich falsch dar und führt so zu Verwirrung.

Der Computer liest nicht wirklich nur "die Einsen und Nullen", sondern wenn Sie ein Buch lesen, lesen Sie "die Buchstaben". Sicher, beide sind streng wahr, aber diese Aussagen lassen eine wesentliche Information aus: die Struktur jedes einzelnen.

Im Fall von Englisch sind die Buchstaben in Wörter strukturiert, und die Wörter bilden nach einer Reihe von Regeln Sätze. Die Reihenfolge der Buchstaben in Wörtern und die Reihenfolge der Wörter in Sätzen kann die Bedeutung vollständig ändern.

Ein ähnlicher Prozess spielt mit Computern und mit der Maschinensprache. Der Computer betrachtet die Einsen und Nullen in diskreten Blöcken, in Bytes und in Gruppen von Bytes.

Andere Poster haben verschiedene Möglichkeiten erwähnt, wie Zahlen als einzelne Bits codiert werden können. Es gibt Ints, Gleitkommazahlen, Textzeichenfolgen usw., die dem Strom von Bits und Bytes Struktur verleihen.

Letztendlich betrachtet der Computer konzeptionell Gruppen von Bits, so dass er selten "10101010", 101, 242 oder 4 usw. betrachtet. Was diese Zahlen bedeuten, hängt von ihrem Kontext in dem gegebenen "Satz" ab sind Teil von.

10
whatsisname

Alle auf den meisten Computern gespeicherten Zahlen werden technisch in binärer Form gespeichert. Auf Hardwareebene wird alles als eine Reihe von Hoch- und Niederspannungssignalen dargestellt. Hochspannungssignale sind Einsen/wahre Werte, Niederspannungssignale sind Nullen/falsche Werte. Dies sind die Bits (kurz für Binärziffern), die bei 32-Bit- oder 64-Bit-Maschinen erwähnt werden. Die Zahl (32,64) bezieht sich in diesem Fall darauf, wie viele Bits gleichzeitig aus dem Speicher adressiert werden können.

In den meisten modernen Computern besteht der Maschinencode also nur aus normalen Werten, die im Speicher gespeichert sind, aber der gesamte Speicher besteht aus Bits.

5
John Garrard

Fast alle "Computer" verwenden heutzutage binäre Logik. Die Bedeutung von "Computer" nach dem Zweiten Weltkrieg bedeutet jedoch ein Computergerät mit dauerhaftem Speicher und gespeicherten Programmen und nicht nur eine einfache Computer-Engine wie einen Taschenrechner.

Einige Beispiele für die Ausnahmen sind:

  • In Labors gibt es möglicherweise einige trinäre (oder mehr) Logiksysteme mit ungeraden Kugeln.
  • Es gibt einige Analog Computing Systeme, die verwendet werden.
  • Ein Beispiel für ein zukünftiges Hochleistungsrechnersystem, das keine binäre Logik verwendet, könnte das D-Wave-Quantenglühsystem sein.
4
Scott Leadley

Die Maschinensprache ist keine universelle Sprache, sondern eine streng CPU-bezogene Sprache - die Sprache, die die CPU versteht.

Sie können eine CPU mit 42 Zuständen anstelle von 2 Zuständen für das kleinste Speicherelement entwerfen. Das Problem ist, dass Sie für eine solche CPU keine ausreichend gute Implementierung erhalten können. Tatsächlich waren einige der ersten Computer (einschließlich ENIAC) Dezimalcomputer , die implizit eine dezimale Maschinensprache verwendeten.

Die Tatsache, dass es sich um einen Dezimal- oder Binärwert oder einen anderen Wert handelt, hängt von der Anzahl der Zustände ab, die das kleinste Speicherelement (ein Bit) annehmen kann. 2 wurde nicht für CPU-Entwurfszwecke ausgewählt, sondern durch die elektronische Implementierung eingeschränkt: Ein Transistor arbeitet viel besser und schneller mit nur 2 Spannungspegeln anstelle von 10 (oder einer anderen natürlichen Zahl größer als 2).

1
m3th0dman