Computer Befehlssatz?

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Am einfachsten lässt sich das wahrscheinlich anhand eines Prozessors erklären, der einen relativ kleinen Befehlssatz hat.

Ich nehme als Beispiel mal den MOS 6510 Prozessor, der z.B. im C64 benutzt wurde. Bei dem ist jeder Opcode genau ein Byte groß (je nach Adressierungsart gehören aber oft noch die nächsten 1-2 Bytes zum Befehl dazu)

Schau dir mal die Tabelle auf dieser Seite an: https://www.c64-wiki.de/wiki/Opcode

Da ist beschrieben, welche Befehle der Prozessor unterstützt. Manche Befehle unterstützen auch mehrere unterschiedliche Adressierungsarten (z.B. ADC (add with carry) unterstützt 8 verschiedene Adressierungsarten (z.B. immediate, also z.B. "addiere die Zahl 100" oder absolute, also z.B. "addiere die Zahl aus der Speicheradresse 100"). Jede Kombination aus Befehl und Adressierungsart hat einen eigenen Opcode. Das ist der eigentliche Maschinensprache-Befehl, den der Prozessor ausführt. Z.B. ADC immediate hat den Opcode 69(hex) bzw. 0110 1001 binär.

Die ganze Tabelle ist der Befehlssatz des Prozessors. Also die Kombination aus allen Befehlen und den Adressierungsarten, die der Prozessor unterstützt. Offiziell zählen nur die "legalen Opcodes" (also die blauen) zum Befehlssatz des Prozessors. Die "illegalen Opcodes" sind vom Hersteller nicht definiert und können halt zu unerwartetem Verhalten führen.

Bei modernen Prozessoren ist der Befehlssatz viel umfangreicher und die Opcodes haben oft sogar eine variable Länge, aber das Prinzip ist immer noch das Gleiche. Also der Befehlssatz ist einfach die Sammlung an Befehlen und Adressierungsarten, die der Prozessor kennt.


Inkognito-Nutzer   08.12.2023, 15:04

Danke jetzt hab ichs endlich besser verstehen können. Ich versuch es zusätzlich noch mit "einführung in die informatik" .

Aber zu wissen wie beispiele für solche befehle aussehen ist ne große erleichterung.. danke!

0
Inkognito-Nutzer   08.12.2023, 15:09

Eine Frage doch noch. Diese "registeradressen" von dennen ich hier aber auch schon wo anders gelesen habe - sind dass die in dem wiki mit : 0x 1x 2x 3x ... ?

Sodass registeradresse wörtlich zu nehmen ist: die adresse/der ort wo ein opcode sich befindet ?

0
daCypher  08.12.2023, 17:32
@Inkognito-Fragesteller

Nein, die 0x, 1x etc. sind nur der erste Teil des Opcodes und die x0, x1 etc. für oben an der Tabelle stehen, sind der zweite Teil des Opcodes. Mein Beispiel "ADC imm" findest du zum Beispiel in der Zeile 6x und der Spalte x9.

Register sind kleine Speicher im Prozessorkern, mit denen der Prozessor direkt rechnen kann. Der C64 hat z.B. nur drei Register. A, X und Y. A wird auch Akkumulator genannt, das ist das Haupt-Rechenregister. Also, wenn du z.B. den Befehl ADC #10 ausführst, wird das Register A um die Zahl 10 erhöht. X und Y werden beim C64 hauptsächlich für Index-Operationen benutzt. Also wenn du einen Programmteil für mehrere Speicherzellen ausführen willst, kannst du X bei jedem durch Durchlauf um 1 erhöhen und einen X- indizierten Befehl laufen lassen, der die Speicheradresse aus dem Befehl plus X nimmt, um die Operation auszuführen. Z.B. ADC $1234, X addiert die Zahl aus der Adresse 1234 + X zum Akkumulator.

Bei Intel Prozessoren gibt es viel mehr Register. Soweit ich weiß, gibt es 16 Register mit jeweils 8 Byte Speicherplatz. Je nach Größe der Zahl haben die auch noch unterschiedliche Namen, aber am geläufigsten dürften EAX, EBX etc. sein. Für 64 Bit heißen sie dann RAX, RBX und so weiter. Es gibt manche Befehle, die nur mit bestimmten Registern funktionieren, aber bei den modernen Prozessoren kenne ich mich nicht gut genug aus, um dir Details zu erklären.

0
Inkognito-Nutzer   09.12.2023, 15:26
@daCypher

Ok aber dass ist schon einiges an info dass muss ich mir noch in ruhe mehrmals ansehen. Zusammen mit dem Buch denke ich wirds noch klick machen

Danke nochmal für die ausführliche Antwort!

0
daCypher  11.12.2023, 09:57
@Inkognito-Fragesteller

Bitteschön :)

Man kann es leider nicht viel einfacher erklären. Vielleicht hilft es dir auch, wenn du dir ein kurzes Assembler-Programm anschaust.

Mal ein "Hello, World!" in C64-Assembler, zusammen mit dem Maschinencode, der dabei rauskommt

  Addr MC        Label     Instruction
  ------------------------------------
  C000 A200   : -          LDX #0
  C002 BD0FC0 : -LOOP      LDA HELLO,X
  C005 F007   : -          BEQ ENDE
  C007 9D0004 : -          STA $0400,X
  C00A E8     : -          INX 
  C00B 4C02C0 : -          JMP LOOP
  C00E 60     : -ENDE      RTS 
                -HELLO     .BY 8,5,12,12,14,","," "
                -          .BY 23,14,18,12,4,"!",0

"Addr" ist die Speicheradresse, an die der jeweilige Befehl geschrieben wird, "MC" ist der Maschinencode in Hexadezimal, die Labels in der "Label"-Spalte kann man benutzen, um keine feste Adresse angeben zu müssen und Instruction ist halt der eigentliche Assemblerbefehl.

  • LDX #0 - Lade eine 0 in das Register X
  • LDA HELLO,X - Lade den Wert beim Label "Hello"+X ins Register A (also wenn X=0 ist, dann die 8, bei X=1 die 5, bei X=2 die 12 und so weiter)
  • BEQ ENDE - Wenn der letzte gelesene Wert eine 0 war, spring zu "ENDE"
  • STA $0400,X - Ansonsten schreibe den Wert aus Register A an die Adresse $0400+X ($0400 ist beim C64 der Anfang des Bildschirmspeichers. Also alles, was da hingeschrieben wird, wird direkt auf dem Bildschirm angezeigt)
  • INX - Erhöhe X um 1
  • JMP LOOP - Springe zu Loop
  • RTS - Ende der Subroutine. Springe zurück zum aufrufenden Programm
  • .BY 8,5,12,12,14,","," " ... - Der Text "Hello, World!" im Screen-Code (also in dem Format, was der C64 für die Anzeige auf dem Bildschirm benutzt. 1=A, 2=B etc.)

Also wie du siehst, muss man einem Prozessor selbst die einfachsten Dinge ziemlich haarklein vorkauen, damit er damit was anfangen kann. Ich hoffe mal, aus dem Beispiel wird es deutlicher, was Register sind. Dem Prozessor muss man halt genau sagen, an welche Adresse oder in welches Register er etwas reinschreiben soll. Die höheren Programmiersprachen nehmen einem das zum Glück alles ab.

Und du siehst, wie der Assembler die Befehle in Maschinencode übersetzt. Das erste Byte (also die ersten beiden Hex-Werte) sind immer der Opcode (also die Kombination aus Befehl und Addressierungsart) und die Bytes, die danach kommen, sind Daten oder Adressen, je nach Befehl. Z.B. "LDX #0" wird übersetzt zu A2 00, also dem Opcode für "LDX immediate" und dem Wert 0 und "LDA HELLO,X" wird übersetzt zu BD 0F C0, also dem Opcode für "LDA absolut x-indiziert" und der Adresse C00F, wo der Text "Hello, World!" anfängt. Die Adresse wird im Big-Endian Format gespeichert, also zuerst das niedrigere Byte und dann das höhere Byte. Das ist beim Lesen ziemlich ungewohnt, aber der Prozessor kann damit besser rechnen.

0

Ein Befehlssatz ist zunächst einmal die Zusammenfassung aller Befehle (und möglicher Parameter von Befehlen), die ein Computer/Prozessor unterstützt. So kann es zum Beispiel mehrere Additionsbefehle geben, die unterschiedliche Parameter haben (z.B. 2 Registeradressen, Register-Adresse und direkte Zahl, Register-Adresse und Speicheradresse...)

In der Regel gibt es von einem Befehlssatz eine "menschenlesbare" Form, z.B. Addiere: add, oder lade: rd/load/mov (Abkürzung zu move)...

Am Schluss verarbeitet der Prozessor aber natürlich die Befehle im Binärformat. Wie das Binärformat aussieht, unterscheidet sich von Befehlssatz zu Befehlssatz.


Inkognito-Nutzer   08.12.2023, 15:02

Ok danke dass war gut erklärt, ist ein kompliziertes thema..

0