Hallo, ich wünsche allen ein schönes 2016. Vorweg ein winziges Stück AVR-Assemblercode über das ich kürzlich gestolpert bin: .equ led_port = PORTB .equ led_ddr = DDRB .equ LED = 0 ;************************************ ; Initialiesierung ;************************************ ldi temp1, 1<<LED out led_ddr, temp1 ; Port B als Ausgang Ok, das ist ja eigentlich ganz primitiv. Mein Problem ist aber das "<<"! Ist das ein Befehl, eine Assembler Direktive oder was? Und was tut es, wozu ist es gut? Und was mich am meisten beschäftigt: Wo kommt es plötzlich her und warum wird es nirgendwo, in keinem Tutorial oder sonst wo erläutert??? Es scheint so als müsse man das "<<" ganz natürlich von Geburt an kennen... Und anscheinend weiss auch jeder worum es geht, nur ich nicht! Habe vor vielen vielen Monden schon sporadisch Z80 und MC68000 in Assembler programmiert, da gabs das nicht. Danach irgendwann muß es geschehen sein, bei AVR taucht es immer wieder auf und niemand erläutert es! Also: Warum schreibt man ldi temp1, 1<<LED und nicht so wie früher ganz einfach ldi temp1, 0b00000001 oder ldi temp1, 0x01 ??? Und ist meine "Übersetzung" überhaupt richtig? Vielen Dank für die Aufmerksamkeit, ich bin wirklich für jede Erklärung dankbar!
assemblirer schrieb: > Also: Warum schreibt man > > ldi temp1, 1<<LED > > und nicht so wie früher ganz einfach Weil so der Quellcode leserlicher ist. Au-erdemist es einfacher, den LED-Pin einfach mal innerhalb dieses Ports zu verlagern. > > ldi temp1, 0b00000001 oder > ldi temp1, 0x01 ??? > > Und ist meine "Übersetzung" überhaupt richtig? Ja, ist sie.
Ok, vielen Dank erstmal. Es wird also tatsächlich nur eine 1 an der Binärstelle eingfügt, die in "LED" definiert ist? Es würde also .equ LED = 3 ....... ....... ldi temp1, 1<<LED ganz einfach einem ldi temp1, 0b00001000 entsprechen? Hört sich albern an, aber darf ich fragen woher ihr das alle wisst???
assemblirer schrieb: > Hört sich albern an, aber darf ich fragen woher ihr das alle wisst??? C-Buch... "LED" wird vom Präprozessor durch den zweiten Teil des Define ersetzt. das "<<" ist ein Linksverschieben um die Anzahl der Bits. C-Grundlagen
assemblirer schrieb: > Hört sich albern an, aber darf ich fragen woher ihr das alle wisst??? Die Programmiersprache gelernt (in C wird das vergleichbar verwendet), hier im Tutorial alle möglichen Beispiele angeschaut und anfangs sich die selben Fragen gestellt wie du - nur vielleicht mit etwas mehr Ausdauer selber nachgeforscht :-).
STK500-Besitzer schrieb: > assemblirer schrieb: >> Hört sich albern an, aber darf ich fragen woher ihr das alle wisst??? > > C-Buch... > > "LED" wird vom Präprozessor durch den zweiten Teil des Define ersetzt. > das "<<" ist ein Linksverschieben um die Anzahl der Bits. > > C-Grundlagen Aber das ist doch gar kein C :-)
H.Joachim S. schrieb: > Aber das ist doch gar kein C :-) Mag sein. Bei mir zählt es zu dessen Grundlagen.
assemblirer schrieb: > Und was mich am meisten beschäftigt: Wo kommt es plötzlich her und warum > wird es nirgendwo, in keinem Tutorial oder sonst wo erläutert??? > > Es scheint so als müsse man das "<<" ganz natürlich von Geburt an > kennen... Und anscheinend weiss auch jeder worum es geht, nur ich nicht! Also, als Arduino Jünger weiß ich, dass ich nicht alles weiß. Und wenn ich was wissen will, dann schaue ich nach. Und jetzt habe ich mal ausprobiert, wie schwierig es ist an die "<<" Doku ran zu kommen... Ich nehme mal an, du verwendest den "gnu as" für AVRs. Die Doku dazu zu finden, hat keine 5 Minuten gedauert. https://sourceware.org/binutils/docs/as/Infix-Ops.html#Infix-Ops Tipp: Lies dir die Doku zu dem Werkzeug, welches du benutzt ruhig mal ganz durch. Da dürften sich noch viele weiteres nützliche Dinge finden.
H.Joachim S. schrieb: > Aber das ist doch gar kein C :-) Ich darf mir mal wieder an Kopp fassen - aus eigener Dämlichkeit.
Das wird es wohl sein, keine Peilung von "C"! Ja, das ist echt schade, aber ich mag C nicht und da es bei mir nur um Hobby geht... Aber, da ist jetzt noch etwas: Was ist wenn temp1 schon vorher Daten enthielt? Also als Beispiel, es kommt im Programm zunächst einmal ein: .equ LED = 3 ....... ldi temp1, 0b11000011 und später dann irgendwann ldi temp1, 1<<LED Befindet sich in temp1 jetzt 0b00001000 oder bleiben die alten Bits erhalten, so daß das Ergebnis 0b11001011 ist??? Oder ist alles noch komplizierter, weil: STK500-Besitzer schrieb: > das "<<" ist ein Linksverschieben um die Anzahl der Bits. ??? grübel,grübel... Vielen Dank und entschuldigung wenn ich nerve... :-))
Ulrich F. schrieb: > Die Doku dazu zu finden, hat keine 5 Minuten gedauert. > https://sourceware.org/binutils/docs/as/Infix-Ops.html#Infix-Ops Super. Die Leute werden sich bedanken! MfG Paul
Hallo Paul, Das ist doch dein Problem, bzw. eine Einstellung des Browsers ! Ich erhalte diese Meldung nicht.
Ulrich F. schrieb: > Und jetzt habe ich mal ausprobiert, wie schwierig es ist an die "<<" > Doku ran zu kommen... > > Ich nehme mal an, du verwendest den "gnu as" für AVRs. > Die Doku dazu zu finden, hat keine 5 Minuten gedauert. > https://sourceware.org/binutils/docs/as/Infix-Ops.html#Infix-Ops Ich verwende AVR-Studio 4.xx. Ja, Shift Left... Über das Linksschieben bin ich auch schon gestolpert, es ergibt für mich aber in diesem Zusammenhang überhaupt keinen Sinn. Ich verstehe nicht wo da etwas geschoben wird, etwa die alten Bits die schon zuvor im Register standen??? Das gibt ja ein heilloses Durcheinander, dann bleib ich lieber beim ldi xxxxx, 0b11000011 da weiß ich was raus kommt - nämlich genau das was ich rein geschrieben habe... :-))
HI
>Hört sich albern an, aber darf ich fragen woher ihr das alle wisst???
Hilfe zum Assembler. Stichwort Exprssions.
MfG Spess
assemblirer schrieb: > Ich verstehe nicht wo da etwas geschoben wird, etwa die alten Bits die > schon zuvor im Register standen??? Mannoo... Ohne jede AS Ahnung, weiß ich doch genau was da passiert. assemblirer schrieb: > Das gibt ja ein heilloses Durcheinander, Nur in deinem Kopf... Und auch nur weil du das so willst. Denn es würde sich klären lassen. assemblirer schrieb: > Ich verwende AVR-Studio 4.xx. Das ist eine IDE, kein Assembler.
Karl M. schrieb: > Das ist doch dein Problem, bzw. eine Einstellung des Browsers ! > > Ich erhalte diese Meldung nicht. Was Du nicht siehst, ist nicht da. Bist Du bei den Grünen oder was? -Paul-
Gerade für solche und ähnliche Fragen ist der Debugger im AS doch die optimale Informationsquelle. Führe die Befehle einfach aus und beobachte das Ergebnis.
Hallo Miteinander, vielleicht hilft Dir diese Sprechweise zum Ausdruck:
1 | ldi R16,(1<<3) |
Lade R16 mit einem Wert: Bit 3 ist gesetzt. Ein Byte B lässt sich wie folgt schreiben: B = 2⁷ + 2⁶ + 2⁵ + 2⁴ + 2³ + 2² + 2¹ + 2⁰ Jedes Byte hat als an seinen 8 Bit-Positionen verschiedene Wertigkeiten. Es gilt: Bit 0 = 2⁰ Bit 1 = 2¹ : Bit 7 = 2⁷ Man sieht also leicht Bit n == 2^n Und genau das macht der Ausdruck:
1 | ldi R16,(1<<n) |
Paul B. schrieb: > Ulrich F. schrieb: >> Die Doku dazu zu finden, hat keine 5 Minuten gedauert. >> https://sourceware.org/binutils/docs/as/Infix-Ops.html#Infix-Ops > > Super. Die Leute werden sich bedanken! > Ich sehe da auch keine Meldung. Und wen interessiert schon das SSL Zertifikat. Bei einer Bank, oder überhaupt beim Geschäftsverkehr muss das schon ok sein. Aber bei einer Doku.... ist das doch echt wurscht. Es tut mir leid, das dich das stört. Und wenn ich hätte gewusst, dass (bei dir) eine solche Meldung kommt, wäre der Link nicht von mir gekommen. Jetzt hilfts ganze Gemäcker. und Geschrei, nicht mehr... Kann den Beitrag nicht mehr editieren.
@assemblierer schrieb: >Hört sich albern an, aber darf ich fragen woher ihr das alle wisst??? Hmmm gugli? web? Wissensdrang? :-) http://www.avr-asm-tutorial.net/avr_de/beginner/diraus.html Gruß!
Hallo, wenn Du das 4er Studio benutzt einfach mal Help->AVR Tools User Guide-> Assembler oder/und Assembler2 anschauen. Ist zwar etwas rumblättern darin, aber irgendwann findet man auch Operators. Man hat das eigentlich alles zur Hand im Studio. Das erspart zwar Suchen im Forum oder bei Google nicht komplett wenn man mit englsch oder Spezialausdrücken Probleme hat, aber man hat die Anhaltspunkt, wonach man sucht. Gruß aus Berlin Michael
tueduino schrieb: > Hmmm gugli? web? Wissensdrang? :-) > > http://www.avr-asm-tutorial.net/avr_de/beginner/diraus.html > > Gruß! Ja, vielen dank auch für diesen Link. Ich glaube das habe ich schon alles durchgelesen, verstehe nur nicht was da geschoben wird?? Es gibt Assembler Befehle zum Schieben, beim AVR (und auch beim 68000..) wäre lsl so einer (Z80:sla...). Das ist logisch, der Inhalt eines Registers wird verschoben. Dessen Inhalt ändert sich ja auch entsprechend... Aber bei << ?? Da wird doch nichts geschoben, da wird einfach eine Konstante in ein Register geschrieben. Oder wie?? Tut mir leid, ich verstehe beim besten Willen nicht, was das mit schieben zu tun hat! Trotzdem vielen Dank an alle, die es mit einer Erklärung versucht haben. Achso, bitte jetzt nicht erklären daß "sla" beim Z80 etwas anderes macht wie "lsl" beim AVR, das weiß ich. Das einzige was ich nicht weiß, ist wo bei << ewas verschoben wird... :-))) Na ja, egal...
Das << erzeugt keinen Befehlscode, das wird als Ausdruck ausgewertet und erzeugt eine Konstante die in dem Assemblerbefehl benutzt wird. Stell dir vor da stünde ein Pluszeichen, da würde ja auch kein Additionsbefehl erzeugt.
assemblirer schrieb: > Das einzige was ich nicht weiß, ist wo bei << ewas verschoben wird... Bei mir ist es andersrum: ich weiß zwar, dass dieses "sehr viel kleiner"-Zeichen den linken Operanden um die Zahl der Stellen des rechten Operanden nach links schiebt, aber ich weiß ganz viel anderes nicht. > Na ja, egal... Naja, wenn das so ist...
LDI braucht als 2.Operand eine 8-Bit Zahl. Diese kann man - hinschreiben, nachdem man sie im Kopf errechnet hat, oder - den Assembler rechnen lassen Im 2.Fall hat man bei obigem Problem, Bitmaske aus Bitnummer errechnen, eigentlich 2 "hoch" Bitnummer zu rechnen, was binär eine Eins um "Bitnummer" Stellen nach links verschoben ist. Und diese Linksverschiebung macht der Assembler, der "Compiler", nicht die gleichnamige Programmiersprache, mit dem Operator "<<". Der stammt zwar aus der Bösen Sprache "C', aber zeigt auch bildhaft, was er zu tun gedenkt. Wer Angst vorm Schieben hat, schreibt einfach:
1 | SBI led_ddr, LED |
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.
