Hallo, ich habe ein Verständnisproblem mit dem Befehlssatz für den CPU32 Kern. Im Reference Manual steht z.B. beim Befehl ADD: "The mode of the instruction indicates which operand is the source and which is the destination as well as the operand size." - Was ist dieser "mode" von dem da die Rede ist? - Kann ich nicht einfach davon ausgehen, dass der erstgenannte Parameter 'source' ist und der Zweite 'destination'? Falls ich hier im falschen Forum gelandet sein sollte seid mir bitte nicht böse. Ich bin für jede Antwort dankbar. Freundliche Grüße, Armin
Von 68000 habe ich noch im Hinterkopf, daß es nicht einen ADD-Befehl gibt, sondern mehrere. Diese Varianten unterscheiden sich duch die Schreibweise, z.B. ADD.B op1,op2 addiert Bytes, während ADD.W op1,op2 Words addiert (2 Bytes) und ADD.L op1,op2 entsprechend LONG-Werte mit je 4 Byte. Vielleicht meinst du das mit Mode...
Ja, das mit der Länge ist mir auch schon aufgefallen. Mich irritiert jedoch der Teil "... indicates which operand is the source and which is the destination... ". Wenn ich z.B.
1 | ADD.W d3,d4 |
schreibe, in welches Register wird denn dann das Ergebnis geschrieben?
Im tatsächlichen Maschinencode haben alle ADD-Befehle dann jeweils ein paar Bit gemeinsam, ein paar Bit entscheiden über B, W oder L, und ein paar weitere dann, ob Quelle ein Register ist, ein direkter Wert im Befehl, ein nachfolgender Wert etc.; dto. für das Ziel. Wenn man diese zusätzlichen Bits nach dem für alle ADD gemeinsamen Bitmuster als "mode" bezeichnet, macht dein Zitat Sinn. Im Assemblerquelltext schreibst du trotzdem einfach Quelle,Ziel hin.
Okay, vielen Dank für die Antwort. Jetzt bin ich schon wieder etwas schlauer :-)
> ADD.W d3,d4 > schreibe, in welches Register wird denn dann das Ergebnis geschrieben? meist in das erste register
Hallo, das Problem ist, dass ich mich auf "meist" nicht verlassen kann. Irgendwo muss das doch festgeschrieben sein. Außerdem widerspricht das ja jetzt der Aussage von Klaus Wachtler...
Armin schrieb: > das Problem ist, dass ich mich auf "meist" nicht verlassen kann. > Irgendwo muss das doch festgeschrieben sein. Ist es. Im entsprechenden Architektur-Referenzhandbuch.
In der Motorola-Welt wurde immer Quelle,Ziel geschrieben. Intel hat dann aus irgendwelchen Gründen Ziel,Quellte propagiert mit dem Erfolg, daß jetzt jeder durcheinander kommt. Letztlich hängt es am Assembler, den man verwendet. Dem GNU-Assembler kann man meines Wissens beide Formen unterschieben, je nach Aufruf. Das ursprüngliche Zitat stammt vermutlich aus einer Beschreibung des Maschinencodes, darauf bezieht sich meine Erklärung mit den Bits. Das hat mit der Syntax und Semantik des Assemblers nichts mehr zu tun.
@Klaus Wachtler
> bei 68000 immer in das zweite angegebene, also ADD Quelle,Ziel
zum glück hatte ich "meist" geschrieben, ich kannte bis nur andersrum.
Wieder etwas gelernt.
Klaus Wachtler schrieb: > In der Motorola-Welt wurde immer Quelle,Ziel geschrieben. > Intel hat dann aus irgendwelchen Gründen Ziel,Quellte propagiert > mit dem Erfolg, daß jetzt jeder durcheinander kommt. Dieser Spass ist viel älter als diese beiden ehemaligen Kontrahenden. Intels Variante findet sich auch schon beim 8080 und Motorola hatte das direkt vom Vorbild übernommen, nämlich von DEC - allerdings mit einem kleinen aber feinen Unterschied, der die Verwirrung komplett macht. Logisch sind sie beide. Motorolas Version entspricht der westlichen Schreibreihenfolge, "Intels" Version der dahinter stehenden Zuweisung, mit sub r1, r2, r3 als Notation für r1 = r2 - r3 Wirklich interessant wird es bei einer Vergleichsoperation. Die "Intel" Variante ist da ziemlich natürlich, denn cmp ax,bx liefert im Status das Ergebnis von (ax - bx). In der Motorola-Variante hingegen springt cmp d0, d1 blt label (branch if less than) wenn d0 grösser als d1 ist, was durchaus gewöhnungsbedürftig ist. Immerhin war Motorola damit konsequenter als DEC, denn bei der PDP-11 arbeitet CMP andersrum als üblich, weil vom Assembler umgedreht, und so passt zwar cmp r0, r1 (r0 - r1) blt label zur Intuition, aber nicht zur überall sonst ziemlich ähnlichen Operation sub r0, r1 (r1 - r0) blt label Natürlich ist auch eine dritte Version ziemlich verbreitet, wenn l 7, mem (load reg 7) und st 7, mem (store reg 7) die Operanden eher nach Funktion und Codierung als als nach Richtung sortiert werden.
ja, hast ja mit dem meisten recht. ABER: > hingegen springt > cmp d0, d1 > blt label (branch if less than) > wenn d0 grösser als d1 ist, was durchaus gewöhnungsbedürftig ist. DAS ist die natürliche Version, die andere ist gewöhnungsbedürftig! (sorry, ich habe halt zuerst und eigentlich nur Motorola-Assembler gelernt.)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.