Assembler Befehlart

Gast #2743081
Lesenswert?

Hallo,

ich hoffe einer von euch kann bei der Frage nach Assembler Befehlart 
helfen.
Und zwar wenn ich mich noch richtig erinnern kann gibts es bei Assembler 
zwei Befehlarten:

- eine Art ist Motorola
- und die andere ist Intel

ist es so korrekt? wenn nicht kann mir einer vielleicht wieder auf die 
Sprünge helfen und mich korrigieren?

Danke im Voraus!

Gruss Kunnis
Persönliche Seite #2743097
Lesenswert?

Nein. Mit Assembler hat das direkt nichts zu tun.

Es gibt zwei unterschiedliche Arten, Werte im Speicher abzulegen, die 
mehr als ein Byte Speicherplatz benötigen.

Betrachten wir das am Beispiel des Wertes 0x1234

Die "big-endian"-Variante speichert das höherwertige Byte zuerst, also

Adresse | Wert
--------+----
  0     | 0x12
  1     | 0x34

Die "little-endian"-Variante macht das genau andersherum:

Adresse | Wert
--------+----
  0     | 0x34
  1     | 0x12

Intel verwendet üblicherweise "little-endian", währenddem Motorola 
üblicherweise "big-endian" verwendet.
Gast #2743101
Lesenswert?

Hi

>ich hoffe einer von euch kann bei der Frage nach Assembler Befehlart
>helfen.

Was meinst du mit 'Assembler Befehlart'?

>- eine Art ist Motorola
>- und die andere ist Intel

Wenn ich diese Zusammenstellung lese fällt mir eher das Format von 
Hex-Files ein:

- Intel Hex Format
- Motorola S-records

MfG Spess
Gast #2743585
Lesenswert?

ZITAT:

Eine Assemblersprache (oft abgekürzt als ASM bzw. asm) ist eine 
spezielle Programmiersprache, welche die Maschinensprache einer 
spezifischen Prozessorarchitektur in einer für den Menschen lesbareren 
Form repräsentiert. Jede Computerarchitektur hat folglich ihre eigene 
Assemblersprache.

Quelle: http://de.wikipedia.org/wiki/Assemblersprache


Assemblersprachen: viele
Byteanordnung: zwei
Application binary interface (ABI): ein paar
#2743588
Lesenswert?

Kunnis schrieb:
> Hallo,
>
> ja jetzt müsst ihr aber nicht übertreiben.

Doch. Muss man.
Denn das ist eine Frage der Schreibweise.
Den eigentlichen Prozessor interessiert das nicht die Bohne. Der hat 
seine Hex-Codes, die Befehle codieren. Und in diesen geben bestimmte 
Bits an, was als Quelle und was als Ziel fungieren soll.

Ob du sagst

  Die Fahrzeit von Wien nach Salzburg beträgt 2 Stunden

oder

  Nach Salzburg braucht man von Wien aus 2 Stunden

ist gehupft wie gesprungen. Die Information ist in beiden Fällen 
dieselbe. Egal ob im Satz jetzt Wien oder Salzburg als erstes genannt 
wird.
#2743596
Lesenswert?

Mini Float schrieb:
> Los, fangen wir an die 16bit-Häppchen einer 32bit-Zahl wie Intel zu
> speichern, die 8bit-Teile der 16bit-Happen dann wie Motorola.
> Der Kreativität und dem Chaos sind keine Grenzen gesetzt. Ich darf doch
> wohl meine Zahl speichern wie ICH will!!!

Du darfst sogar die Bits innerhalb eines Bytes verdrehen wie du willst. 
:-)
Oder nibbelübergreifend durchmischen.
Gast #2743602
Lesenswert?

Diese Behauptung könnte auch dem Umstand entspringen, dass es für 
x86-Prozessoren zwei populäre Assembler-Syntaxen (Was ist eigentlich die 
korrekte Mehrzahl von "Syntax"? Syntaktae?) gibt, die aufgrund der 
Firma, die zuerst einen Assembler mit der Syntax entwarf, benannt sind: 
Intel und AT&T.

Die unterscheiden sich wie von Pako beschrieben in der Reihenfolge der 
Operanden (und ein paar anderen Details). Intel-Syntax ist in der 
DOS/Windows-Welt populär, während der GCC bei den meisten Prozessoren 
die AT&T-Syntax verwendet.

Dass es "nur" zwei gibt, liegt allerdings daran, dass jeder, der einen 
Assembler schreibt, sich an etwas orientiert, was es schon gibt. Es 
hindert dich niemand daran, einen Assembler zu schreiben, bei denen

MOV EAX, EBX

zu folgendem wird:

SCHWEINESCHNITZEL! LESNIEREN? GRÜNKOHL.

(Wobei "schweineschnitzel" und "grünkohl" Registernamen sind, und 
"lesnieren" der Opcode. Lesnieren ist übrigens gefährlich, macht das nie 
:)
Gast #2743608
Lesenswert?

Karl Heinz Buchegger schrieb:
> Doch. Muss man.
> Denn das ist eine Frage der Schreibweise.
> Den eigentlichen Prozessor interessiert das nicht die Bohne. Der hat
> seine Hex-Codes, die Befehle codieren. Und in diesen geben bestimmte
> Bits an, was als Quelle und was als Ziel fungieren soll.

Ein Prozessor-Hersteller gibt umfangreiche Manuals heraus, in denen die 
Assembler-Syntax beschrieben ist, z.b. beim AVR die "Instruction Set 
Nomenclature" (doc0856.pdf).
Allerdings kann natürlich jeder Schelm einen Compiler programmieren, der 
sich nicht daran hält (was natürlich recht sinnlos wäre).

Allerdings kann man das wohl kaum an Motorola und Intel festzurren.
Gast #2743611
Lesenswert?

Sam P. schrieb:
> Dass es "nur" zwei gibt, liegt allerdings daran, dass jeder, der einen
> Assembler schreibt, sich an etwas orientiert, was es schon gibt. Es
> hindert dich niemand daran, einen Assembler zu schreiben, bei denen
>
> MOV EAX, EBX

Guter Einwand!
Es gibt ja auch noch die invers-polnische Notation:

R0 R1 MOV
#2743617
Lesenswert?

Pako schrieb:
> Karl Heinz Buchegger schrieb:
>> Doch. Muss man.
>> Denn das ist eine Frage der Schreibweise.
>> Den eigentlichen Prozessor interessiert das nicht die Bohne. Der hat
>> seine Hex-Codes, die Befehle codieren. Und in diesen geben bestimmte
>> Bits an, was als Quelle und was als Ziel fungieren soll.
>
> Ein Prozessor-Hersteller gibt umfangreiche Manuals heraus, in denen die
> Assembler-Syntax beschrieben ist, z.b. beim AVR die "Instruction Set
> Nomenclature" (doc0856.pdf).

Die sind aber nicht Gesetz.

 Ob die eine Firma jetzt

  LD  A, B

und die andere

  MOV  A, B

und eine weitere

  MOV  B, A

für ihren Assembler benutzen will oder nicht, kann jeder für sich 
entscheiden wie er will. Die nächsten schreiben

  A <- B
oder
  B -> A

Genauso: BRANCH und JUMP bzw. noch viele weitere Dinge, die immer wieder 
unterschiedlich heißen aber im Grunde das gleiche mit andern Worten 
sind.
Gast #2743630
Lesenswert?

Karl Heinz Buchegger schrieb:
>> Ein Prozessor-Hersteller gibt umfangreiche Manuals heraus, in denen die
>> Assembler-Syntax beschrieben ist, z.b. beim AVR die "Instruction Set
>> Nomenclature" (doc0856.pdf).
>
> Die sind aber nicht Gesetz.

Das ist natürlich richtig.
Ich hätte nur vermutet, daß sich keiner traut, es anders zu machen, als 
von einem Motorola oder Intel vorgegeben.


> Genauso: BRANCH und JUMP bzw. noch viele weitere Dinge, die immer wieder
> unterschiedlich heißen aber im Grunde das gleiche sind.

Also ich hatte vom 68000er noch drinn, daß "bra" schneller geht als 
"jump", weil es ein relativer Sprung ist (kürzerer Befehl, kürzere 
Reichweite)...
#2743631
Lesenswert?

Karl Heinz Buchegger schrieb:
> Du darfst sogar die Bits innerhalb eines Bytes verdrehen wie du willst.

Und das auch noch unabhängig von der Byteorder, obwohl da bei genauerem 
Nachdenken eigentlich logischer Zusammenhang besteht. Und wenn du das 
mal falsch gemacht hast, dann reparierst du das eben bei nächsten Update 
und bringst ein Kiste, die bei den alten Bitbefehlen die Bits von rechts 
nach links und bei neuen Bitbefehlen von links nach rechts nummieriert.
#2743639
Lesenswert?

Pako schrieb:
> Karl Heinz Buchegger schrieb:
>>> Ein Prozessor-Hersteller gibt umfangreiche Manuals heraus, in denen die
>>> Assembler-Syntax beschrieben ist, z.b. beim AVR die "Instruction Set
>>> Nomenclature" (doc0856.pdf).
>>
>> Die sind aber nicht Gesetz.
>
> Das ist natürlich richtig.
> Ich hätte nur vermutet, daß sich keiner traut, es anders zu machen, als
> von einem Motorola oder Intel vorgegeben.

Mir fällt jetzt der Name nicht mehr ein.
Für den Z80 gab es einen Assembler, bei dem alles (und ich meine alles) 
komplett anders aussah als bei Zilog.

Der Z80 hat eine Befehlsobermenge der 8080 Befehle. Brauchst aber nicht 
glauben, dass Zilog dieselben Mnemonics benutzt hat, wie Intel.

>> Genauso: BRANCH und JUMP bzw. noch viele weitere Dinge, die immer wieder
>> unterschiedlich heißen aber im Grunde das gleiche sind.
>
> Also ich hatte vom 68000er noch drinn, daß "bra" schneller geht als
> "jump", weil es ein relativer Sprung ist (kürzerer Befehl, kürzere
> Reichweite)...

Kann mich nicht erinnern, ich denke aber das ist falsch. Branch und Jump 
waren exakt identisch. Motorola hat halt die Bezeichnung Branch 
bevorzugt, während Intel das Ganze Jump genannt hat.
#2743641
Lesenswert?

Karl Heinz Buchegger schrieb:
> Der Z80 hat eine Befehlsobermenge der 8080 Befehle. Brauchst aber nicht
> glauben, dass Zilog dieselben Mnemonics benutzt hat, wie Intel.

War bei NEC V20/30 auch so. Exakte Obermenge von 8088/86, aber kein 
Befehl hiess so wie bei Intel. Der Grund dürften Befürchtungen wegen 
Copyright oder sowas sein.

> Kann mich nicht erinnern, ich denke aber das ist falsch. Branch und Jump
> waren exakt identisch. Motorola hat halt die Bezeichnung Branch
> bevorzugt, während Intel das Ganze Jump genannt hat.

Nope. Motorola hatte beides. Branches PC-relativ, Jumps nicht.

Das Mnemonic "S" für "Springe" gabs aber auch schon, und zwar ganz 
offiziell.
#2743648
Lesenswert?

Karl Heinz Buchegger schrieb:

> Mir fällt jetzt der Name nicht mehr ein.
> Für den Z80 gab es einen Assembler, bei dem alles (und ich meine alles)
> komplett anders aussah als bei Zilog.

Hach ich komm nicht mehr auf den Namen. Er liegt mit auf der Zunge aber 
will nicht raus.

Das sah dann so aus

   A := B
oder
   A := [HL]

(Das ist jetzt wieder was, an dem ich die halbe Nacht grübeln werde :-)
#2743652
Lesenswert?

Sowas in der Art hatte ich mir mal gestrickt. Eine Art Minimal-Compiler, 
der praktisch nur aus lex/yacc bestand. Im Lowlevel konnte man dann
  B = *HL;
  HL := DE;
  if (A == 2) {
     ....
  }
schreiben, Bisschen höher gings aber auch noch (Variablen, Ausdrücke, 
Switch-Statement).
Gast #2743657
Lesenswert?

A. K. schrieb:
>> Kann mich nicht erinnern, ich denke aber das ist falsch. Branch und Jump
>> waren exakt identisch. Motorola hat halt die Bezeichnung Branch
>> bevorzugt, während Intel das Ganze Jump genannt hat.
>
> Nope. Motorola hatte beides. Branches PC-relativ, Jumps nicht.

Ich hab viele Jahre nur 68000 gekannt. Als ich dann zum ersten mal mit 
anderem in Berühung kam, war das ein ziemlicher Kulturschock:
- "MOV Ziel,Quelle" anstatt dem korrekten "move Quelle,Ziel"
- Little Endian anstatt dem korrekten Big-Endian
- keine Differenzierung von Branch und Jump
- und was ist ein Accu???
#2743661
Lesenswert?

Pako schrieb:
> - Little Endian anstatt dem korrekten Big-Endian

Wobei eben bei Motorola die vorhin erwähnten Esel sassen, die anfangs 
zwar die Bytes von links nach rechts aber die Bits von rechts nach links 
nummerierten. Und bei den später hinzu kommenden Bitfeldern prompt in 
der Tinte sassen.

Andere waren konsequenter und nummerierten auch die Bits von links nach 
rechts. Das kann freilich auch für einen Kulturschock gut sein 
(IBM-360/370/..., Power[PC], TI 990[0]).
Gast #2744298
Lesenswert?

A. K. schrieb:
> Wobei eben bei Motorola die vorhin erwähnten Esel sassen, die anfangs
> zwar die Bytes von links nach rechts aber die Bits von rechts nach links
> nummerierten. Und bei den später hinzu kommenden Bitfeldern prompt in
> der Tinte sassen.

Und ich hatte immer gedacht, daß der 68000er viel besser wäre als der 
x86.
Aber nach der 80186-Diskussion und diesem Thread muß ich das wohl 
nochmal überdenken...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren