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