hallo,
ich bin mir bewusst, dass Sprungmarken nicht ohne Grund Einzug in die
Assembler gehalten haben... Dennoch habe ich mich gestern gefragt, ob in
diesem Beispiel
ldi r16,10
delay:
dec arg1
brne delay
der relative Sprung nicht wirklich relativ angegeben werden kann. Also
direkt k angeben. Das das fehlerträchtig ist, ist mir bewusst, in
solchen Fällen, oder wenn nur eine Zeile übersprungen werden soll, fände
ich das manchmal schöner, weil zu viele Sprungmarken machen es auch
manchmal unübersichtlicher.
Gästchen schrieb: > der relative Sprung nicht wirklich relativ angegeben werden kann. Also > direkt k angeben. Das das fehlerträchtig ist, ist mir bewusst, in > solchen Fällen, oder wenn nur eine Zeile übersprungen werden soll, fände > ich das manchmal schöner, weil zu viele Sprungmarken machen es auch > manchmal unübersichtlicher. Ja, bis du dann irgendwann ein zweite Zeile einfügst, wo eigentlich bloß eine übersprungen werden sollte. Oder noch fieser: die eine Zeile so änderst, daß die Instruktion eine andere Größe bekommt... Nö, den Ärger will man nicht wirklich. Aber du hast natürlich andererseits trotzdem völlig Recht bezüglich der Übersichtlichkeit, die leidet unter zu vielen Labels wirklich erheblich. Ich habe diesen scheinbar unauflösbaren Widerspruch für mich einfach so gelöst: Ich benutze auch für solche "hochlokalen" Sprünge Labels, rücke die aber einfach genauso ein wie den Code, schreibe sie in die gleiche Zeile wie den angesprungenen Code und benutze für solche "lokalen" Labels einen führenden Unterstrich (den ich sonst als C-Hasser selbstverständlich nirgendwo benutze). Also z.B. sowas:
1 | nibble2hex: |
2 | subi R16,-'0' |
3 | cpi R16,'9'+1 |
4 | brcs _n2hdn |
5 | subi R16,-7 |
6 | _n2hdn: ret |
Damit behältst du erstmal den ganz wesentlichen Vorteil, daß der Assembler sich um Änderungen zwischen Sprungstart und Sprungziel weiterhin selber kümmert, die Übersichtlichkeit im großen Rahmen wird sehr viel besser und, last but not least, auch beim Lesen innerhalb so einer Routine kann man selbst ohne besondere Gewöhnung an diese Schreibweise noch einigermaßen schnell erfassen, wo das Sprungziel ist. Voraussetzung ist natürlich, daß man die Sache wirklich konsequent auf solche "hochlokalen" Sprünge beschränkt. Sprungziel und sämtliche Sprünge dorthin sollten sich im Minimum immer völlig problemlos auf einer einzigen Bildschirmseite gleichzeitig sichtbar machen lassen können, sonst wird's schnell kontraproduktiv.
c-hater schrieb: > Ich benutze auch für solche "hochlokalen" Sprünge Labels, rücke > die aber einfach genauso ein wie den Code, schreibe sie in die gleiche > Zeile wie den angesprungenen Code und benutze für solche "lokalen" > Labels einen führenden Unterstrich... Das finde ich gar nicht mal schlecht! Der Underscore dürfte in der Labels-Übersicht des Atmel Studios auch dafür sorgen, dass die "uninteressanten" Sprungmarken nicht die "interessanten" verschmutzen. Das probiere ich auch mal.
Vom hp48-Assembler bin ich lokale Label der Art '+', '++' oder '-' gewohnt: 'GOTO +' springt vorwärts zum nächsten '+:', '++' desgleichen, '-' entsprechend rückwärts. Enthebt mich der ständigen Suche nach irgendwelchen Phantasienamen für die lokalen Label. Ich habe aber keine Ahnung, wie ich das beim avrasm hinbekommen könnte, folglich verwende ich 'pc+..' bzw. 'pc-..', trotz der geschilderten Probleme.
Schöne Idee! Gleiche Meinung. Durch die Einrückung geht in der lokalen Sprungziel-Zeile natürlich etwas Platz flöten. Wenn man sich so wie ich angewöhnt hat, Sprungmarken zur Zeilenersparnis in die gleiche Zeile wie die zugehörige erste Instruktion zu schreiben, diesen Bereich für aussagekräftige Namen aber etwas breiter halten muß, die Instruktion des lokalen Sprungziels selber mit langnamiger Variable daherkommt und womöglich noch ein aussagekräftiger Kommentar folgt, dann kann der Platz schonmal eng werden- wenn es jede Zeile 1:1 auf den Drucker schaffen soll ;-)
Moby schrieb: > wenn es jede Zeile 1:1 auf den Drucker schaffen soll ;-) Ähemm... Was ist ein Drucker? ;o)
Manche Assembler haben einfache lokale Labels, so dass man für solchen Kleinkram keine eindeutigen Namen erfinden muss. GAS beispielsweise: http://tigcc.ticalc.org/doc/gnuasm.html#SEC48L
Das entspricht ja der Idee bei hp; ob z.B. '--' oder '2b' wäre mir egal, wenn's denn beim avrasm ginge.
> Ähemm... Was ist ein Drucker? ;o)
"DER DRUCKER DRUCKT, ICH WILL DAS NICHT"
Wenn, damals vor Jahrzehnten, eine HP250 abstürzte, konnte man durch
Antippen der Leertaste einen Speicher-Dump ausdrucken (und einschicken).
Einem Kunden war dies versehentlich passiert, und völlig entnervt schrie
er mir obigen Satz durch's Telephon entgegen - einfach abzuschalten
traute er sich nicht.
c-hater schrieb: > Was ist ein Drucker? Ein Gerät, um Code ohne Strom überarbeiten zu können... Ganz nützlich für mehrstündige, zuweilen sonst recht langweilige Situationen, in denen private elektronische Geräte offiziell nicht erlaubt sind ;-)
Gästchen schrieb: > hallo, > > ich bin mir bewusst, dass Sprungmarken nicht ohne Grund Einzug in die > Assembler gehalten haben... Dennoch habe ich mich gestern gefragt, ob in > diesem Beispiel > > ldi r16,10 > delay: > dec arg1 > brne delay > > der relative Sprung nicht wirklich relativ angegeben werden kann. Also > direkt k angeben. Das das fehlerträchtig ist, ist mir bewusst, in Es geht ja auch ohne den Offset explizite hinzuschreiben:
1 | ldi r16,10 |
2 | 0: |
3 | dec r16 |
4 | brne 0b ;; Zum nächsten, "b"achward (rückwärst) gefundenen Label "0" |
Solche Labels sind wirklich lokal, d.h. können auch mehrfach im Code
auftauchen. Gesprungen wird jeweils zum nächsten auffindbaren. Soll
der Sprung vorwärts gehen, wird das Label als "0f" ("f"orward) notiert.
Jede nicht-negative, ganze Zahl kann verwendet werden.
Für sprechende Labels, die nicht global angezeigt werden sollen (z.B.
mit objdump etc.) verwendet man Labels der Gestalt .Lname. Wobei diese
— wie "normale" Labels auch — höchstens einmal pro Modul verwendet
werden dürfen.
Hi
>Es geht ja auch ohne den Offset explizite hinzuschreiben:
Welchen Assembler meinst du? Bei mir, Assembler1 und Assembler2, wird
wird das mit einem Syntaxfehler angemeckert.
MfG Spess
Also mein (steinalter) avrasm 2.0.28 kann das nicht, bei '0:' kommt die Meldung "syntax error". Ab welcher Version geht das, und wo könnte ich diese allein (standalone) herunterladen?
spess53 schrieb: > Welchen Assembler meinst du S. Landolt schrieb: > Ab welcher Version geht das, Die folgenden beiden Beiträge beziehen sich auf den GNU-Assembler: A. K. schrieb: > Manche Assembler haben einfache lokale Labels, so dass man für solchen > Kleinkram keine eindeutigen Namen erfinden muss. GAS beispielsweise: > http://tigcc.ticalc.org/doc/gnuasm.html#SEC48L Johann L. schrieb: > Es geht ja auch ohne den Offset explizite hinzuschreiben: S. Landolt schrieb: > und wo könnte ich diese allein (standalone) herunterladen? Für Windows weiß ich's nicht, für Linux gibt es in den meisten Distributionen ein Paket namens "binutils-avr", das den Assembler, Linker und ein paar weitere Tools enthält. Wer eine funktionierende AVR-GCC Installation hat (egal, ob Windows oder Linux), der hat auch die Binutils bereits installiert. Einfach mal nach avr-as bzw. avr-as.exe suchen. Den Sourcecode gibt es natürlich auch: http://www.gnu.org/software/binutils/ Man sollte beachten, dass die Syntax des avr-as etwas anders als die des avrasm ist. Das betrifft vor allem die Pseudo-Ops, aber z.T. auch die normalen Prozessorinstruktionen. Bestehenden Code muss man also erst einmal etwas anpassen, wenn man den Assembler wechseln möchte.
Herzlichen Dank! Ich arbeite unter Windows, und habe mittlerweile doch einen beträchtlichen Programmfundus, würde also ungern größere Anpassungen vornehmen, zumal ich mit der 'pc+n'- bzw. 'pc-m'-Konstruktion leben kann. Vielleicht schaue ich mir Ihren Vorschlag nach dem Aschermittwoch näher an.
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.