Forum: Mikrocontroller und Digitale Elektronik Befehlssatz CPU32


von Armin (Gast)


Lesenswert?

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 Klaus W. (mfgkw)


Lesenswert?

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

von Armin (Gast)


Lesenswert?

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?

von Klaus W. (mfgkw)


Lesenswert?

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.

von Armin (Gast)


Lesenswert?

Okay, vielen Dank für die Antwort. Jetzt bin ich schon wieder etwas 
schlauer :-)

von Marcus K. (marcusk)


Lesenswert?

> ADD.W d3,d4
> schreibe, in welches Register wird denn dann das Ergebnis geschrieben?

meist in das erste register

von Armin (Gast)


Lesenswert?

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

von Klaus W. (mfgkw)


Lesenswert?

@Marcus Kunze:
bei 68000 immer in das zweite angegebene, also ADD Quelle,Ziel

von (prx) A. K. (prx)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

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.

von Marcus K. (marcusk)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

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
Noch kein Account? Hier anmelden.