Forum: Mikrocontroller und Digitale Elektronik AVR ASM: Warum immer r16?


von Kaj (Gast)


Lesenswert?

Hallo Leute.

Ich hab da mal eine verstaendnis Frage.
Ich beschaeftige mich gerade mit Assemblerprogrammierung auf den AVRs 
(hab schon ASM auf dem 68HC11/68332 programmiert, ist aber schon ein 
paar Tage her), weil mir C/C++ ein bisschen zu langweilig ist.
In so ziemlich jedem ASM-Beispiel (sei es im Internet oder in Buechern) 
wird anscheinend das Register r16 besonders gerne benutzt.
Es wird zwar geschrieben das die 32 Register gleichwertig seien, aber 
trotzdem wird immer wieder mit vorliebe r16 genutzt.

Warum ist das so? Gibt es besondere Gruende, ein Register (r16) einem 
anderen Register (z.B. r5) vorzuziehen? Oder wird das so geschrieben, 
weil es schon immer so geschrieben wurde, und Einer beim Anderen 
abschreibt?

Waere Euch sehr dankbar, wenn Ihr mir da auf die Spruenge helfen 
koenntet. :)

Gruesse

von tip (Gast)


Lesenswert?

weil LDI nicht unter r16 geht

von tip (Gast)


Lesenswert?

tip schrieb:
> weil LDI nicht unter r16 geht

sorry, meinte LDS

von spess53 (Gast)


Lesenswert?

Hi

>Es wird zwar geschrieben das die 32 Register gleichwertig seien, aber
>trotzdem wird immer wieder mit vorliebe r16 genutzt.

Die Register sind nicht 'gleichwertig'. Die Register r0...r15 werden nur 
von einem etwas eingeschränkten Befehlssatz unterstützt. Bei r24...r31 
kommen noch 16Bit-Befehle dazu. r26...r31 können paarweise als Pointer 
(X,Y,Z) im RAM fungieren. r31:r30 (Z) zusätzlich als Pointer im Flash.

MfG Spess

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

Kaj schrieb:
> weil mir C/C++ ein bisschen zu langweilig ist.

ein Schachprogramm in reinem Assembler zu schreiben ist halt was für 
echte Kerle, die nehmen da auch kein langweiliges C/C++  ...

von Kaj (Gast)


Lesenswert?

Wegstaben Verbuchsler schrieb:
> Kaj schrieb:
>> weil mir C/C++ ein bisschen zu langweilig ist.
>
> ein Schachprogramm in reinem Assembler zu schreiben ist halt was für
> echte Kerle, die nehmen da auch kein langweiliges C/C++  ...

So sehe ich das auch :)
Spass bei Seite: so war das ja gar nicht gemeint. Ich meinte, das C/C++ 
zwar schoen und gut ist (der Zweck heiligt halt die Mittel), mich aber 
momentan nicht reizt. Bei ASM gefaellt es mir, wirklich nachvollziehen 
zu koennen was passiert, warum es passiert, wo Zeit verloren geht, etc. 
Ist ja aber geschmackssache. :)

tip schrieb:
> tip schrieb:
>> weil LDI nicht unter r16 geht
>
> sorry, meinte LDS

spess53 schrieb:
> Die Register sind nicht 'gleichwertig'. Die Register r0...r15 werden nur
> von einem etwas eingeschränkten Befehlssatz unterstützt. Bei r24...r31
> kommen noch 16Bit-Befehle dazu. r26...r31 können paarweise als Pointer
> (X,Y,Z) im RAM fungieren. r31:r30 (Z) zusätzlich als Pointer im Flash.
>
> MfG Spess

Ich danke euch fuer die Antworten. Das hilft mir auf jeden Fall. :)
Vielen Dank.

Gruesse

von Cyblord -. (cyblord)


Lesenswert?

Kaj schrieb:
> weil mir C/C++ ein bisschen zu langweilig ist.

Finde es seltsam wenn man die Herausforderung in der Programmiersprache 
und nicht im Programm selbst suchen muss. Zeugt aus meiner Sicht nicht 
von besonders ausgeprägten Programmierfähigkeiten, wenn man die 
Benutzung seines Werkzeuges bereits als Aufgabe an sich, ansieht.

Man denke nur an einen Zimmermann der nicht den Anspruch hat, ein 
besonders schönes Möbelstück zu machen, sondern nur irgendeines aber 
möglichst nur mit einer Hand und nur mit verrostetem Werkzeug, weil 
sonst zu langweilig.

: Bearbeitet durch User
von Kaj (Gast)


Lesenswert?

cyblord ---- schrieb:
> Finde es seltsam wenn man die Herausforderung in der Programmiersprache
> und nicht im Programm selbst suchen muss. Zeugt aus meiner Sicht nicht
> von besonders ausgeprägten Programmierfähigkeiten, wenn man die
> Benutzung seines Werkzeuges bereits als Aufgabe an sich, ansieht.

Dann lass es mich so sagen:
C/C++ ist mir zuweit von der Hardware entfernt, und reizt mich deswegen 
nicht, weil es mir viele Dinge abnimmt.

Natuerlich kann der Zimmermann das Holz mit Maschinen bearbeiten, weil 
es schneller geht, er kann aber genauso gut statt der Kreissaege den 
Fuchsschwanz oder die Buegelsaege nehmen.

cyblord ---- schrieb:
> Zeugt aus meiner Sicht nicht
> von besonders ausgeprägten Programmierfähigkeiten
Ich bin nicht der beste Programmierer, stimmt. Und die Faehigkeit ist ja 
auch nicht vonanfang an da, sondern muss reifen. Und da ist es meiner 
meinung nach auch mal hilfreich, eine andere Sprache zu waehlen(um zu 
sehen wie man ein Problem dort loesen kann), und ich fuer meinen Teil 
nehme diesmal halt keine Hochsprache (C, C++, C#, Python, Java und wie 
sie nicht alle heissen), sondern will mich mal auf das Wesentliche 
konzentrieren.

cyblord ---- schrieb:
> Finde es seltsam wenn man die Herausforderung in der Programmiersprache
> und nicht im Programm selbst suchen muss.
Die erste Herausforderung ist eine Sprache zu erlernen und die zweite 
ist, sie dann auch anzuwenden.
Du versuchst ja auch nicht japanisch zu sprechen, ohne vorher die 
Sprache zu lernen, oder? ;)


Das kann jeder halten wie er will. Ich halte es so, wie ich es 
beschrieben habe.

Gruesse

von Oliver (Gast)


Lesenswert?

Kaj schrieb:
> C/C++ ist mir zuweit von der Hardware entfernt, und reizt mich deswegen
> nicht, weil es mir viele Dinge abnimmt.

Das nimmt dir z.B. ab, wissen zu müssen, wie sich die einzelnen Register 
eines AVR unterscheiden. Denn mal ganz ernsthaft, wer auch nur 
ansatzweise vorhat, einen Prozessor in Assembler zu programmieren, 
sollte internen Aufbau, Datenblatt, und vor allem den Befehlssatz 
kennen.

Solltest du Atmels doc0856.pdf noch nicht haben, wird es allerhöchste 
Zeit.

Oliver

von Helge A. (besupreme)


Lesenswert?

cyblord ---- schrieb:
> Finde es seltsam wenn man die Herausforderung in der Programmiersprache
> und nicht im Programm selbst suchen muss. Zeugt aus meiner Sicht nicht
> von besonders ausgeprägten Programmierfähigkeiten, wenn man die
> Benutzung seines Werkzeuges bereits als Aufgabe an sich, ansieht.

Bist du einer von denen, die lieber ein 5GB Programm erzeugen mit C++### 
statt ein paar Assemblerkommandos..??.. ;)

(Ist vielleicht OT - ich muß mich im Job häufig mit einem 
"Programmierwerkzeug" rumärgern. Das ist nur 2GB groß, braucht ne 
Datenbank, und stürzt immer wieder ab. Hauptaufgabe der Software ist die 
Erstellung von ein paar XML- und Textdateien, die in die Zielsteuerung 
geladen werden.)

von a. l. (artur78)


Lesenswert?

Tschuldigung wegen OffTopic, aber da die Frage ja bereits beantwortet 
wurde, mache ich mal eine Bemerkung.

Da will sich einer mit einem sehr elementaren und nütlichen Thema 
beschäftigen, was ich persönlcih gut finde, und trotzdem wird etwas 
gefunden um es im schlecht zu machen.

Mich wundert dass noch nicht aufs Datenblatt verwiesen wurde))

Kaj, ich sag nur hau rein!

von oldmax (Gast)


Lesenswert?

Hi
Was hackt ihr eigentlich auf Leuten rum, die sich mit Assembler 
beschäftigen wollen.
@Cyblord
>Finde es seltsam wenn man die Herausforderung in der Programmiersprache
>und nicht im Programm selbst suchen muss. Zeugt aus meiner Sicht nicht
>von besonders ausgeprägten Programmierfähigkeiten, wenn man die
>Benutzung seines Werkzeuges bereits als Aufgabe an sich, ansieht.

völlig überflüssige Antwort auf die Frage. Der rest ist auch nicht 
besser und der Vergleich hinkt gewaltig.
@Kaj
Ok, wenn du dich mit Assembler beschäftigst, könnte dir vielleicht das 
Programm "OpenEye" hilfreich sein. Such mal danach hier im Forum. Ich 
hab es vor ein paar Jahren hier eingestellt. Es ermöglicht dir die 
Ansicht von VAriablen zur Laufzeit im Controller.
Gruß oldmax

von procter (Gast)


Lesenswert?

Oliver schrieb:
> internen Aufbau, Datenblatt, und vor allem den Befehlssatz
> kennen.
>
> Solltest du Atmels doc0856.pdf noch nicht haben, wird es allerhöchste
> Zeit

@ a.I.
Da stehts doch, brauchst Dich nicht mehr zu wundern

von Uwe (Gast)


Lesenswert?

Intern wurde bei den Register R0 bis R15 anscheinend der Mux, der den 
Source Operanden vom Instruktions-Datenbus holen kann weggelassen.
Somit sind absolut keine Immediate Befehle möglich. Also Befehle bei 
denen eine Konstante als zweiter operand im Befehlswort kodiert ist.

von Axel S. (a-za-z0-9)


Lesenswert?

Uwe schrieb:
> Intern wurde bei den Register R0 bis R15 anscheinend der Mux, der den
> Source Operanden vom Instruktions-Datenbus holen kann weggelassen.
> Somit sind absolut keine Immediate Befehle möglich.

Das hat weniger mit "Mux weglassen" zu tun als mit der begrenzten Anzahl 
Bits in einem Maschinenbefehl. Die AVRs verwenden 16-Bit pro Befehl und 
bei wenigen Befehlen weitere 16 Bit für Daten (z.B. bei LDS für die 
Adresse im Daten-Addreßraum).

Von den 16 Bits im Befehlswort braucht man nun einige, die den Befehl 
selber spezifizieren. Und wenn der Befehl Register-Adressen oder 
Immediate-Parameter enthält, dann brauchen die auch Bits. Und nun ist es 
halt so, daß

1
  ldi rX, Y

schon 8 Bit für das Immediate Y braucht. Wenn man jetzt alle 32 Register 
zulassen würde, bräuchte man 5 weitere Bits für X und hätte nur noch 3 
für den eigentlichen Opcode. Jetzt hat man aber mit ANDI, CPI, LDI, ORI, 
SBCI und SUBI schon 6 der mit 3 Bit möglichen 8 Kombinationen verwendet, 
was wiederum bedeutet, daß alle anderen Maschinenbefehle mit den 
verbleibenden 2 Kombinationen dieser 3 Bits codiert werden müßten.

Und weil das zu knapp geworden wäre, hat Atmel halt lieber den 
Wertebereich der Register für die __I Opcodes auf 16-31 eingeschränkt, 
was sich in 4 Bit codieren läßt. Jetzt bleiben 4 Bit für den 
eigentlichen Opcode, wovon 6 Kombinationen für o.g. Befehle und 10 als 
Prefix für den Rest verwendet werden.

Was lernen wir daraus: es ist eine hohe Kunst, Befehlssätze für µC 
festzulegen. Insbesondere wenn man nicht den Luxus sehr breiter 
Befehlsworte (VLIW) oder einen Befehlssatz mit vielen unterschiedlichen 
Befehlslängen (wie x86 <brr>) hat. Noch gar nicht beachtet in obigen 
Überlegungen ist, wie der Aufbau des Befehlssatzes die Komplexität der 
Dekodierungslogik beeinflußt. Bspw. wäre es wünschenswert, wenn Befehle 
die 1 Register addressieren, die Bits mit der Registeradresse immer an 
der gleichen Position im Befehlswort vorfänden. etc. pp.


XL

von Oliver (Gast)


Lesenswert?

Die technischen Hintergründe sind prima zu wissen.

Aber eigentlich reicht es bei der Fragestellung des TO, sich beim ersten 
eigenen Programm über die Fehlermeldng des Assmeblers in der Zeile
1
ldi r0, 42
zu wundern, und dann mal die Doku zum Befehlssatz bzw. ldi lesen.

Der richtige Weg wäre es zwar, zuerst die Doku oder ein Turorial zum 
Thema zu lesen, aber das ist wohl realitätsfremd.

Oliver

von oldmax (Gast)


Lesenswert?

Hi

Oliver schrieb:
> Die technischen Hintergründe sind prima zu wissen.
>
> Aber eigentlich reicht es bei der Fragestellung des TO, sich beim ersten
> eigenen Programm über die Fehlermeldng des Assmeblers in der Zeile
>
1
ldi r0, 42
> zu wundern, und dann mal die Doku zum Befehlssatz bzw. ldi lesen.
>
> Der richtige Weg wäre es zwar, zuerst die Doku oder ein Turorial zum
> Thema zu lesen, aber das ist wohl realitätsfremd.
>
> Oliver

Nein Oliver. Es gibt Fragen, die sich einfach mal so stellen, ohne das 
es zwangsläufig einen Griff zum Datenblatt geben muss. Die Frage galt 
wohl dem Verständnis, warum immer r16 und nicht r12 oder r18 oder oder 
oder. Klar, irgendwann, wenn man glaubt, man macht es besser und nutzt 
auch mal die Register ab 0, wird man auf das von dir beschriebene 
Problem stoßen und wenn die installierte Hilfedatei nich viel dazu sagt, 
wird man vermutlich auch das Datenblatt zur Hand nehmen. Für mich hat 
der Fragesteller sich nicht aus Faulheit der Community bedient, sondern 
eine durchaus berechtigte Frage gestellt. Aus den Antworten war soweit 
ich es überblickt habe nur eine einzige richtig!
Tja, ein Controller hört eben nicht auf Worte, sondern verbastelt in 
wirklichkeit nur elektrische Signale.
Gruß oldmax

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.