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 ;-)
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
> Ä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 duS. 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#SEC48LJohann 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.