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
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
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++ ...
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 LDSspess53 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
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.
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
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
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.)
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!
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
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
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.
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
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
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
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