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.
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.)