-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: Assembler richtig lernen ?

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied Avatar von Ferdinand
    Registriert seit
    10.09.2004
    Ort
    Stuttgart
    Alter
    37
    Beiträge
    196

    Assembler richtig lernen ?

    Anzeige

    Hallo

    Ich möchte gerne Assembler richtig lernen für AVR ATmega8, 16, 32, 644, usw.

    Und habe dabei noch ein par Probleme und zwar,

    Port Richtung festlegen und Register sofort beschreiben (lib), und Rjump das habe ich schon brgriefen aber wen es dann um die anderen Befehle geht da hapert es noch, z.B.:

    Der befehl „AND“ wen ich jetzt 2 Register mit unter schiedlichen hex werten habe r17 = 0x3E,
    und r18 = 0x46, und ich möchte die über einander legen z.B.: 0011 1110 und 0100 0110 = 0000 0110 oder“ 0x3E & 0x46 = 0x06 „ wie mache ich das dann mit dem befehl.

    Und wie erkene ich wie ich einen befehl einsetsen muss gibt es da Tricks, Esel büken usw.

    Und was wären den die am häufig verwendeten Befehle und wie werden die angewendet.

    Könnt ihr mir mal ne kleine liste machen ich find mich in dem Befehls Satz nicht zu Recht.

    Mit freundlichen Grüßen Ferdinand.
    habe schreiben erst heute gelernt.

    bin legasteniger.

    by Ferdinand.

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.07.2006
    Ort
    Karlsruhe/München
    Alter
    27
    Beiträge
    587
    Hallo,
    erst mal was du vielleicht nicht hören willst:
    vor 2 Jahr hatte ich auch mal probiert vol aufl Assembler umzusteigen. Der Nachteil von Assembler ist, dass man relativ langsam ist, und sich bei Registern immer definitiv festlegt, und nicht mal schnell von R16 auf R17 wechseln kann. Ich habe mich deshalb entschieden auf C umzusteigen, da das wesentlich besser optimiert als es ein einziger Mensch kann, schneller ist und trotzdem dank inline-Assembler vollen Handlungsspielraum gibt. Und genau diesen würde ich dir nahe legen. Zum einen kann man die Routinen von C und zum anderen die Freiheit von Assembler gewiesen, wobei dir C immer unter die Arme greift (bessergesagt: greifen kann), z.b. bei der Registerwahl. Wichtig dabei ist es, immer das Listing vom Compiler durchzuschauen.

    Aber dazu muss man Assembler erstmal richtig können!

    Mal ein Bsp. für die And
    ldi r17,0x3E
    ldi r18,0x46
    and r17,r18
    und in r17 ist das Ergebnis.

    Einen guten Tipp um erstmal alle Befehle zu lernen, ist sich die Liste der Befehle sozusagen als Spickzettel auszudrucken. Da ist auch immer eine kleine Beschreibung dabei. Was gut hilfst Assembler zu lernen ist mal ein Listing von C durchzuschauen.

    Wichtige Befehle:
    ldi,cp,cpi,mov,die ganzen branch-brefehle, sbi, cbi, and, or, andi, in, out, sbrc, sbrs, sbic, sbis, rjmp, jmp

    Am Besten lernt man durch eine Aufgabenstellung:
    Mein Vorschlag wäre mal ein 1Bit Und(or(xor))-Gatter zu bauen.

  3. #3
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.554
    Ich habe im AVRStudio ein bisschen was in Assembler geschrieben für den AVR. Dort ist eine phantastische Hilfe für jeden einzelnen Befehl: Cursor auf den Befehl legen, sagen wir mal auf ldi, F1 drücken - dann erscheint ein pop up mit dem Befehl als Mnemonic (Load Immediate) und einer Beschreibung, der Operation, der Syntax, Opcode, Example, Befehlslänge und Zyklusdauer. Neben dem Fenster liegt dann noch eine komplette Liste aller Befehle. Es ist einfach Spitze!
    Ciao sagt der JoeamBerg

  5. #5
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Vieles kann man in Assembler auch gut lernen indem man versucht fremden Code zu verstehen. Dazu würden sich z.B. die Application notes von Atmel anbieten oder halt das was ein Compiler ausgibt.
    Ansonsten: lerning by doing.

    Ein C Compliler hat schon Vorteile, aber gerade bei typischen Controlleraufgabe kann man auch ohne viel Übung besser optimieren als der Compiler. Wenn es um komplizierterAlgorythemen und viel Arytmetik mit langen Zahlen geht ist der Compiler etwas im Vorteil. Gerade wenn es um schnell Reaktion auf Interrupts geht sind die C Compiler deutlich langsamer. Von hand kann man einfach mehr daten immer in den Registern halten.
    Wenn man den Inline Assembler braucht, muß dann doch assebler können.

    Was man durch das programmieren in Assembler gut lernt ist es vor dem eigentlichen programmieren das ganze gut zu planen und nicht wild drauflos zu schreiben. Da hilft dann auch für bessere Programme in C oder Basic.

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.554
    Zitat Zitat von Besserwessi
    ... Was man durch das programmieren in Assembler gut lernt ist es vor dem eigentlichen programmieren das ganze gut zu planen und nicht wild drauflos zu schreiben ...
    Einen wichtigen Vorteil sehe ich im Assembler in seiner Hardwarenähe. Ich habe letzten September angefangen mich mit den µControllern zu beschäftigen (die mich schon lange interessiert hatten) - und genaugenommen mit der eigentlichen Absicht, C zu lernen. Aber ich hatte absichtlich mit Assembler begonnen, eben um die Hardware und ihre Funktion zu begreifen. Ich kann mir auch nicht vorstellen, dass jemand sinnvollen C-Code für µController hinkriegt ohne Assembler - weil eben etliche hardware-nahe Programmschritte wohl nur durch inline-Assembler möglich sind. Und wer beispielsweise noch nie eine Interrupt Service Routine in Assembler geschrieben hat, wird auch kaum ne Ahnung haben, wieviel Zeit (=Maschinenzyklen) beim Funktionenaufruf durch so "unsinnige" Nebentätigkeiten vergehen wie "Push" und "Pop".

    Insgesamt hatte ich in dieser Zeit einige hundert, wahrscheinlich über tausend, Zeilen Assembler geschrieben.
    Ciao sagt der JoeamBerg

  7. #7
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Man kann auch hardwarenahe Sachen in C Programmieren. Nur muß man damit rechnen das das Program mit etwa halber Geschwindigkeit läuft und dafür doppelt so groß ist. Für die wenigen ganz spezielle, Teile wie den Watchdog- reset, gibt es dann halt extra libraries oder controllerspezifische Erweiterung damit das auch in C geht. Selbst für kurze, zyklus-genaue Verzögerungen gibt es extra Makros zum einbinden, zumindestens bei GCC.

    Für mehr allgemeine Programmteile hat C den Vorteil einer etwas besseren Übersichtlichkeit und Wiederverwendbarkeit des Codes. Für so ganz kurze Sachen die man noch gut überblicken kann (z.B. LED blinken), und wo man noch reichlich Register hat ist Assembler recht leicht zu programmieren.

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied Avatar von drew
    Registriert seit
    06.04.2005
    Beiträge
    150
    Hallo,

    ...Nur muß man damit rechnen das das Program mit etwa halber Geschwindigkeit läuft und dafür doppelt so groß ist..
    Das würde ich jetzt mal bezweifeln! Die Optimierer bei 'C' sind schon sehr gut. Ich würde sogar behaupten, dass ein 'C'-Code insgesammt häufig zu einem schnelleren Program führt, als Assembler (Wenn man in einer vertretbaren Zeit fertig sein will).

    Drew


  9. #9
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.554
    Etwas ist bei C nachteilig, das kommt aber von seinem Vorteil: Jeder Aufruf einer Routine sichert eine Menge Register - vermutlich mehr, als man in Assembler machen würde. Das kostet natürlich Zeit und ich hatte schon Zeit (in C) dadurch gespart, dass ich eine kurze Routine, die mehrfach gebraucht wurde, einfach mehrmals als Code an die entsprechenden Stellen geschrieben habe - also den Routinenaufruf vermieden habe. Wie so etwas mit guter Optimierung läuft weiss ich nicht. Aber im Allgemeinen kann ich nicht nachvollziehen, dass C sooooo viel langsamer als Assembler ist. Diese "Faustregel" halb so schnell aber doppelt so gross - klingt mir wie eine Stammtischweisheit (nur mit genug Bier glaubhaft). Beweisen kann ich es wirklich nicht, aber ein paarmal hatte ich schon einfache Codezeilen von C nach der Übersetzung in Assembler angeguckt - und die sahen sehr effektiv aus.
    Ciao sagt der JoeamBerg

  10. #10
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Wie gut der C Compiler optimiert hängt stark von der Aufgabe ab. Für Längere Programme und eher komplizierte Prgrammteile ist der Compiler im Vorteil. Bei sehr kurzen Teilen und gerade bei Interrupts ist man in Assembler klar im Vorteil, denn man kann besser bestimmen welche Daten man in den Registern läßt, und was man ins Ram Schicken muß. Um da auch in C schnell zu werden muß man dann schon einiges tricksen mit Register variablen, unions usw. Es hängt dann natürlich auch davon ab wie gut man im Assembler optimieren von Hand ist, aber ohne Übung kriegt man auch in C langsamen Code hin (z.B. indem man integer und unsigned Int mischt, wo es nicht nötig ist). Der richtig große Vorteil von Assembler kommt dann, wenn das Programm so klein ist, das man das RAM gar nicht braucht. Gerade beim AVR ist der RAM Zugriff nicht sehr effektiv.

    Der Faktor 2 ist wirklich sehr grob. Wenn der Code dem C Compiler liegt, hat man oft fast keinen Unterschied oder leichte Vorteile für den Compiler. Wenn man Register statt RAM benutzen kann, kann der Unterschied auch größer werden.

    Beim optimieren von Code muß man sich auch immer fragen, ob das überhaupt lohnt, denn was hilft es wenn das halbe flash leer bleibt oder man länger auf den Tastendruck wartet.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •