www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Befehlssatz CPU32


Autor: Armin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Armin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
ADD.W d3,d4
 schreibe, in welches Register wird denn dann das Ergebnis geschrieben?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Armin (Gast)
Datum:

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

Autor: Marcus Kunze (marcusk)
Datum:

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

meist in das erste register

Autor: Armin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marcus Kunze (marcusk)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.