Arbeitsweise von Prozessoren und Wörter.

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    Arbeitsweise von Prozessoren und Wörter.

    Hi,

    ich wollte mir mal anschauen, wie genau ein Prozessor arbeitet.

    Die grundlegende Idee dahinter ist an sich ja gleich, aber inwiefern unterscheiden sich die verschiedenen Befehlssatzarchitekturen (z.B. EPIC/RISC)?

    Dann noch eine Frage; was meint der Begriff Wort?
    Wikipedia macht mich da nicht ganz schlau..

    Hier mal ein Beispiel:

    Ich hab irgendwo gelesen, dass das Ding (4 bit ROM) 3 Wörter mit eine Länge von jeweils 4 bit hätte, also insgesamt 3*4 = 12bit speichern könne.

    Wenn ich einer 4-bit CPU jetzt einen Befehl gebe, z.B.

    CPY 0011 (etwa 1100 0011)

    der von mir aus das 3. "Wort" aus dem RAM kopiert und in einen freien Register der CPU einfügt,
    besteht die Anweisung, also 1100 0011 folglich aus 2 Wörtern à 4 bit.

    Inwiefern stimmt oder stimmt die Beschreibung nicht?

    lg.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „martinustreveri“ ()

    Ich schreib mal ein Beispiel:
    Mein Relais Copmuter kennt 106 Befehle.
    Davon sind 92 Befehle ein Byte groß.
    Die anderen 14 Befehle benötigen aber zusätzliche Informationen.
    Bei einem Goto wird zuerst der Befehl selbst im Speicher plaziert, dann die oberen 8 Bit der Zieladresse und dann die unteren 8.
    Also sind es 3 Byte, die sich nacheinander im Speicher befinden. Wenn der Computer im Verlauf des Programmes auf 32 stößt (Das ist der Goto Befehl) zählt er zuerst einmal weiter, speichert das ausgelesene in einem 8 Bit Register ab (es wird ja auch genau 1 Byte ausgelesen), zählt nochmal weiter, speichert nochmal das ausgelesene in einem anderen Register ab und dann wird das was zwischengespeichert wurde (beides zusammen) in den Zähler kopiert.

    Oder um das Beispiel von Dir zu nehmen:
    Der Befehl wird dann so im (Arbeits)Speicher angelegt:
    1. Kopierbefehl
    2. Quelladresse
    3. Zieladresse


    An Position 1 wird angegeben dass es sich um einen Kopierbefehl handelt.
    An Position 2 wird die Quelladresse im Speicher angegeben.
    An Position 3 wird die Zieladresse im Speicher angegeben (Quell- und Zieladresse können meinetwegen auch vertauscht sein; hängt von der Hardware ab).

    Der Prozessor "sieht" zuerst, dass er etwas kopieren soll. Er springt eine Adresse weiter und liest die Quelladresse aus, welche er irgendwo zwischenspeichert. Dann springt er wieder eine Adresse weiter und liest die Zieladresse aus, welche er irgendwo anders zwischenspeichert.
    Dann leitet er den Wert, der als erstes geholt wurde (Quelladresse) an den Speicher und der gibt den Wert an der Position aus. Dieser Wert wird zwischengespeichert.
    Dann leitet der Computer den Wert, den er als zweites geholt hat (Zieladresse) an den Speicher und leitet den Wert, der als drittes zwischengespeichert wurde (Der Wert an der Quelladresse) an den Schreibeingang des Speichers, welcher diesen Wert übernimmt.
    Der Befehl ist abgeschlossen.

    Wie man sieht ist das Kopieren eines Wertes der in einem Speicher liegt nicht einfach. Ganz besonders nicht wenn es der Programmspeicher ist. Dann gibt es noch das Problem, dass es passieren kann, dass an der Zieladresse nicht eine für einen wert reservierte Position angegeben wird, sondern eine Position wo Programmcode ausgeführt wird. Das bedeutet man kann einen Befehl ausführen lassen, der als Wert irgendwo anders im Speicher vorliegt. Das kann aber auch zum Problem werden wenn man es falsch handhabt.

    Der Begriff "Wort" wird häufig "falsch" verwendet: "Das Register hat eine Wortbreite von 3 Bit."
    Ein Wort hat aber definitionsgemäß immer 16 Bit (der Datentyp "Word"). Man müsste sagen: "Das Register ist 3 Bit groß." oder bei einem ganzen Speicher: "Der Speicher ist 4096 Mal 8 Bit (oder 1 Byte) groß." wenn es sich um einen Speicher mit 4096 Adressen zu je 8 Bit (bzw. 1 Byte) handelt.


    PS: Y auf Windows: Amerikanisches Tastaturlayout. PowderToy wertet was falsch aus.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Danke;

    Der Begriff "Wort" wird häufig "falsch" verwendet: "Das Register hat eine Wortbreite von 3 Bit."
    Ein Wort hat aber definitionsgemäß immer 16 Bit (der Datentyp "Word"). Man müsste sagen: "Das Register ist 3 Bit groß." oder bei einem ganzen Speicher: "Der Speicher ist 4096 Mal 8 Bit (oder 1 Byte) groß." wenn es sich um einen Speicher mit 4096 Adressen zu je 8 Bit (bzw. 1 Byte) handelt.
    Warum steht dann auf Wikipedia
    Prozessoren der IA-32 80x86 Architektur
    [...]
    16 Bit = 2 Byte = Word
    ? Sofern würde es dann doch ausreichen, wenn man einfach nur 16 Bit = 2 Byte = Word schreibt, weil das ja |Zitat| definitionsgemäß immer 16 Bit |/Zitat| sind. :D

    Dann noch eine weitere Frage:

    Welche Befehle sollten in keinem Prozessor fehlen?
    Habe mir mal eine kleine Liste "ausgedracht":

    MOV (Schiebt Wert von X nach Y)
    GTO (Hat etwas von if; wenn die angegebene Zahl in Register D(frei Verwendbarer Register / Register für Werte aus STDIN) steht, wird im Programm zur angegebenen Zeile gesprungen)
    JMP (Verhält sich wie GTO, nut ohne Bedingung.)
    OUT (die angegebene Zahl wird nach Register E (Register für STDOUT) geschoben und der Anzeigebildschirm aktualisiert)
    IN (liest eine Zahl aus STDIN (kleine Tastatur :D) und schiebt sie in Register D)
    [ALU]
    ADD (klar..)
    SUB (klar..)
    CMP ( X == Y, Ergebnis wird in Register C geschrieben)
    AND (X & Y, Ergebnis => Register C)
    OR (X | Y, Ergebnis => Register C)
    XOR (X XOR Y (kann das Zeichen für XOR nicht schreiben :D), Ergebnis => Register C)
    NOT (!X, Ergebis => Register C)
    LT (X < Y, Ergebnis => Register C)
    GT (X > Y, Ergebnis => Register C)
    RND (Zufallszahl in beliebigen Speicher schieben (RAM-Slot oder Register)

    Das würde prinzipiell schon reichen, um ein kleines Spiel zu programmieren, in dem sich die CPU eine Zahl "ausdenkt", der Spieler raten muss, wenn die geratene Zahl zu klein ist, wird z.B. 0 ausgegeben, wenn zu groß, eine 1, wenn sie richtig ist, von mir aus eine 2 oder 15.

    Wie man evtl. an der 15 schon sehen kann, handelt es sich hierbei um einen 4-bit Prozessor, der auch keine so tollen Komponenten hat:

    Prozessor: Taktgeschwindigkeit vermutlich < 1 Hz, 5 Register, 1 Kern :D
    RAM: 7 Slots
    Programmspeicher: 31 (5 bit) Zeilen à 14 bit für Anweisungen (4 bit = Anweisung, 5 bit = Operand 1, 5 bit = Operand 2, warum auch immer, ich habe vorher 11 bit geschrieben.)

    Naja, ist halt zum üben, egal. :D
    Was haltet ihr von dem (recht überschaubaren) Befehlssatz, bzw. was ist unnötig oder sollte man noch ergänzen?

    lg.

    PS: Habe mir gestern "The Elements Of Computing Systems" gekauft, muss hoffentlich nicht mehr lange mit Fragen quengeln :D

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „martinustreveri“ ()

    16 Bit = 2 Byte = [1] Word

    Passt doch. Der Datentyp Word ist immer 16 Bit groß. Und 16 Bit entsprechen auch 2 Byte. Wo liegt das Problem?

    Wegen den Befehlen: Das sind so ziemlich die Befehle die mein Relais Computer hat ^^.
    Bei der ALU würde ich aber nur rechnen (also Not, And, Or, XOr, Add und Sub und evtl. Rnd)
    und für Vergleiche einen extra Komparator verwenden (Siehe hier).
    Du kannst entweder so wie ich konditionelle Sprungbefehle verwenden (Zero, Sign und Carry bei vorhergehenden ALU Befehlen und C = D(0), C > D(0) und C < D(0) vom Komparator und alle Bedingungen sind negierbar)
    oder in ein Register das Bitweise Ergebnis des Vergleiches schreiben (was bei > und < allerdings nicht viel Sinn hat).

    Weiters würde ich bei der ALU noch zwei Shiftfunktionen einbauen:
    Eine zirkulare Verschiebung (<< bzw. >> in VB).
    Und eine Funktion, die zwei nebeneinanderliegende Bits vertauscht (z.B. die Bits 1 und 2).

    Damit bist Du "Touring fähig" was das Verschieben angeht.


    An Spiele hab ich noch garnicht gedacht. Danke ^^. Wenn Du Ein- und Ausgänge einbaust kannst Du externe Geräte anschließen und mit 4 Bit kriegt man sogar Conway's Game of Life hin (vorausgesetzt man hat genug Ressourcen zur Verfügung; und es wird langsam gehen).

    Der Computer wie Du ihn so geplant hast ist schon mal nicht schlecht. Zum Üben sicherlich vollkommen ausreichend.
    Worauf wird er denn basieren? TTL, CMOS oder Relais, oder was anderes?

    Vielleicht findest Du in dieser Liste was interessantes:
    Spoiler anzeigen

    Quellcode

    1. End 00000000
    2. C = Rnd 00000001
    3. Call 00000010
    4. Return 00000011
    5. Ea = C 000001aa
    6. C = Ia 000010aa
    7. Oa = C 000011aa
    8. C = v 0001vvvv
    9. Goto 00100000
    10. Goto E 00100001
    11. If n C < D(0) Then Goto 001n0101
    12. If n C > D(0) Then Goto 001n0110
    13. If n C = D(0) Then Goto 001n0111
    14. If n Zero Then Goto 001n1001
    15. If n Sign Then Goto 001n1010
    16. If n Carry Then Goto 001n1011
    17. D(a) = C 0100aaaa
    18. A = C 01010000
    19. B = C 01100000
    20. C = D(a) 0111aaaa
    21. C = Not A 10010000
    22. C = A And B 10100000
    23. C = A Or B 10110000
    24. C = A XOr B 11000000
    25. C = A Shl <cs< 1 110100cs
    26. C = A + B 11100000
    27. C = A + v 1111vvvv



    Edit: Ich füg noch schnell ein paar Infos an:

    Call und Return sind dazu da Unterroutinen aurufen zu können.

    Bei If n ... ist mit n eine Negation gemeint. Wenn im Maschinencode das Bit gesetzt ist wird das Ganze negiert.
    So können auch >= und <= implementiert werden. Denn wenn eine Zahl nicht kleiner als eine andere ist, dann muss sie größer oder gleich groß sein.

    Das D Register (oder besser die D Register) ist eine Gruppe aus 16 Registern (je 4 Bit), die gelesen und beschrieben werden können.
    Das D(0) Register und das C Register (welches das "zentrale" Register ist) sind fest mit dem Komparator verbunden. Darum If C < D(0) ...

    Möglicherweise ist Dir der komische Shift Operator aufgefallen: <cs<.
    Die Buchstaben c und s stehen hier für carry und shift. Denn die ALU kann hier nicht nur einfach die Runde verschieben, sondern auch im Falle, dass das Bit, das von ganz vorne (Bit 8) nach ganz hinten (Bit 1) verschoben wird 1 ist das Carry Register setzen. Das wird durch das c signalisiert. Und das Zurückverschieben des vordersten Bits erfolgt nur, wenn das c Bit gesetzt ist.


    Und hier noch der Aufbau des Computers. Dann verstehst Du die Befehle vielleicht leichter.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Niko Ortner“ ()

    16 Bit = 2 Byte = [1] Word

    Passt doch. Der Datentyp Word ist immer 16 Bit groß. Und 16 Bit entsprechen auch 2 Byte. Wo liegt das Problem?
    Klar, aber auf Wikipedia steht noch drüber, dass ein Wort bei der x86 Architektur so aufgebaut ist. Muss das aber zwingend heißen, dass ein Wort bei anderen Architekturen genau so aussieht?

    Dann.. Danke für deine Mühe :D
    Bei der ALU würde ich aber nur rechnen (also Not, And, Or, XOr, Add und Sub und evtl. Rnd)
    und für Vergleiche einen extra Komparator verwenden (Siehe hier).
    Sehe den Sinn darin nicht. Warum sollte man sowas tun? ;o

    Weiters würde ich bei der ALU noch zwei Shiftfunktionen einbauen:
    Eine zirkulare Verschiebung (<< bzw. >> in VB).
    Öhm. Verzeih mir dass ich frage, aber was soll eine zirkulare Verschiebung sein? Google spuckt mir nur Seiten über zirkulare Polarisation aus.
    Und eine Funktion, die zwei nebeneinanderliegende Bits vertauscht (z.B. die Bits 1 und 2).
    Wahrscheinlich meinst du sowas hier?:
    0101
    v
    1001 (oder 0110 oder 1010^^)

    An Spiele hab ich noch garnicht gedacht. Danke ^^. Wenn Du Ein- und Ausgänge einbaust kannst Du externe Geräte anschließen und mit 4 Bit kriegt man sogar Conway's Game of Life hin (vorausgesetzt man hat genug Ressourcen zur Verfügung; und es wird langsam gehen).
    Ob das ganze mit 7 RAM-Slots und 5 Registern und nur 31 Programmzeilen geht.. :D
    Naja, zumindest mal ein kleines Game Of Life wäre realisierbar.
    Dann brauche ich aber wirklich Ein/Ausgänge, mit 7-Segment Displays wäre das denkbar schlecht zu realisieren o:

    Der Computer wie Du ihn so geplant hast ist schon mal nicht schlecht. Zum Üben sicherlich vollkommen ausreichend.
    Worauf wird er denn basieren? TTL, CMOS oder Relais, oder was anderes?
    Naja, ich würde gerne irgendwann mal einen Relay-Computer bauen, mir fehlt z.Zt. aber zum einen das nötige Wissen (kleineres Problem) und das nötige Kleingeld (größeres Problem).
    Von daher werde ich das Teil erstmal mit dem Powder Toy bauen (ya, srsly, bescheuertes Vorhaben. :D).

    End 00000000
    Klar.. Habs oben nur vergessen, ist definitiv dabei..
    Call 00000010
    Return 00000011
    Ähää. Unterroutinen. Im Powder Toy von der Größe irgendwann nicht mehr realisierbar. Sonst auf jeden Fall ne Maßnahme.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „martinustreveri“ ()

    martinustreveri schrieb:

    Öhm. Verzeih mir dass ich frage, aber was soll eine zirkulare Verschiebung sein? Google spuckt mir nur Seiten über zirkulare Polarisation aus.
    er meint höchstwahrscheinlich diese Verschiebung:
    1010 wird durch einmal << zu 0101. Zirkular, weils im Kreis geht

    Skybird schrieb:

    Das sind ja Ubisoftmethoden hier !

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „vb-checker“ ()

    @vb-checker: Jep, das hab ich gemeint.

    @TE:
    Muss das aber zwingend heißen, dass ein Wort bei anderen Architekturen genau so aussieht?

    Daran hab ich ehrlich gesagt noch nicht gedacht. Aber ich denke nicht dass es Architekturabhängig ist. Das wäre blöd, denn dann würden die Datentypen bei (fast) jedem Microcontroller andere Bezeichnungen haben.

    Sehe den Sinn darin nicht. Warum sollte man sowas tun? ;o

    Darfst das natürlich machen wie Du willst ;)

    mit 7-Segment Displays wäre das denkbar schlecht zu realisieren o:

    Ich dachte da an eine LED Matrix mit separater Ansteuerung. 16 mal 16 Punkte lassen sich mit 4 Bit genau ansteuern (Position X, Position Y und gesetzt oder nicht übertragen)
    Wenn Du auch Eingänge hast kannst Du einen externen Arbeitsspeicher anschließen, der z.B. 256 mal 4 Bit halten kann. (zwei mal 4 Bit als Adresse und 4 Bit als Werte).

    Von daher werde ich das Teil erstmal mit dem Powder Toy baue

    Ok, wenn Dir da mal nicht Platz und Möglichkeiten ausgehen (das ganze geht ja nur 2 Dimensional). Aber guter Ansatz.
    "Gut geplant ist halb gebaut!"

    Ähää. Unterroutinen.

    Mit Unterroutinen meinte ich einfach nur einen Sprungbefehl ausführen und in einem Register die ursprüngliche Adresse speichern. Beim Return wird zur gespeicherten Adresse zurückgesprungen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Genau so gut könnte man Unterroutinen aber weglassen und dafür einfach nur Sprungbefehle nutzen. :3
    Ich dachte da an eine LED Matrix mit separater Ansteuerung. 16 mal 16 Punkte lassen sich mit 4 Bit genau ansteuern (Position X, Position Y und gesetzt oder nicht übertragen)
    Wenn Du auch Eingänge hast kannst Du einen externen Arbeitsspeicher anschließen, der z.B. 256 mal 4 Bit halten kann. (zwei mal 4 Bit als Adresse und 4 Bit als Werte).
    Daran dachte ich auch. o:

    Ok, wenn Dir da mal nicht Platz und Möglichkeiten ausgehen (das ganze geht ja nur 2 Dimensional). Aber guter Ansatz.
    Naja, dass das ganze nur 2D ist, ist nicht das Problem; viel mehr die Mapgröße bzw. der Platz, aber ich schlage im Forum gleich mal vor, eine Map-Vergrößerungs-Funktion einzubauen, mit der man die Map (wer hätte es gedacht) vergrößern kann und ich meinen Spaß hab :D


    Gruß.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „martinustreveri“ ()

    Das mit den WORDs ist so ne Sache - m.E. ist die Breite architekturabhängig. Ich habe mal gelernt, dass ein WORD genau die Größe hat, die die Maschine verarbeiten kann. Daher heißt es auch "Maschinenwort". Da Windows am weitesten verbreitet ist und auf x86 mit 32 Bit Registerbreite läuft, müsste ein WORD 32 Bit haben, was aber nicht der Fall ist.

    Hier sind die Definitionen:
    typedef unsigned long DWORD;
    typedef unsigned short WORD;
    Der Grund dafür ist, dass Windows zuerst auf 16 Bit-Maschinen lief, wo die Definition gestimmt hat. Das Problem dahinter ist folgendes: short und long sind nicht eindeutig (wie in .NET). Sicher ist nur eine Sache: Der Datentyp int ist immer genauso breit wie ein Maschinenwort, hier also 32 Bit. Der Typ long ist definiert als "mindestens int", während short als "mindestens 16 Bit, maximal int" definiert ist. Quelle: galileocomputing.de/katalog/buecher/titel/gp/titelID-1278, Volltextsuche "mindestens int", Seite 43 unten.

    Zusammengefasst: 1 WORD ist nicht dasselbe wie ein Wort ("Maschinenwort"). WORD ist ein konstruierter Typ, der mit der Wirklichkeit wenig zutun hat.
    Gruß
    hal2000
    Danke, das wollte ich wissen.

    Wäre ja auch denkbar doof, wenn der Datentyp WORD sich an die Prozessorarchitektur anpassen würde.
    Würde die Aussage
    Der RAM-Speicher hat 16 >Wörter< mit einer Breite von jeweils 4 bit.
    dann auf einen RAM-Speicher mit 16 * 4 = insgesamt 64 bit Speicher passen?

    lg.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „martinustreveri“ ()

    @martinus: Der RAM hat damit nichts zutun. Es kommt darauf an, was die ALU verarbeitet. Die ALU-Register bieten einen guten Anhaltspunkt. Angenommen, wir haben einen 16-Bit-Rechner. Der Datenbus ist jedoch nur 8 Bit breit. Das heißt, dass wir 2 Takte brauchen, um ein Maschinenwort aus dem Speicher zu lesen. Dabei ist es irrelevant, wie der Speicher aufgebaut ist - stell ihn dir einfach als Blackbox vor, die eine Adresse annimmt und 8 Bit ausgibt oder entgegennimmt. Keine Frage - es ist natürlich performancetechnisch optimal, wenn die ALU genau eine Registerbreite verarbeitet, der Datenbus genauso oder ein Vielfaches davon breit ist und der Speicher nicht erst ein Magnetband linear durchsuchen muss, sondern gleich Blöcke der richtigen Größe zurückgibt. So ist das Ganze auch heutzutage gelöst - vgl. doeben-henisch.de/fh/I-RA/I-RA-TH/VL3/i-ra-th3.html.
    Gruß
    hal2000
    @hal2000: Wow! Gut erklärt.
    Also ein Maschinenwort und WORD ist was anderes. Werd's mir merken^^.

    @TE: Bei (Arbeits)Speichern sollte man aufpassen: 16 * 4 Bit ist zwar 64 Bit, aber das gibt man so eigentlich nie an ("Ich hab einen 34359738368 Bit Arbeitsspeicher"). Und meistens haben solche Speicher eine "Wortbreite von 8 Bit" XD.
    Also kann man bei z.B. 16 mal 8 Bit gleich 16 Byte sagen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils