Forum: Mikrocontroller und Digitale Elektronik avr asm relativen Sprung direkt codieren


von Gästchen (Gast)


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

Sowas wie:
   bne pc-1

von Gästchen (Gast)


Lesenswert?

Genau, danke. Kopfklatsch

von c-hater (Gast)


Lesenswert?

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.

von Hannes (Gast)


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

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.

von Moby (Gast)


Lesenswert?

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 ;-)

von c-hater (Gast)


Lesenswert?

Moby schrieb:

> wenn es jede Zeile 1:1 auf den Drucker schaffen soll ;-)

Ähemm... Was ist ein Drucker? ;o)

von (prx) A. K. (prx)


Lesenswert?

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

von S. Landolt (Gast)


Lesenswert?

Das entspricht ja der Idee bei hp; ob z.B. '--' oder '2b' wäre mir egal, 
wenn's denn beim avrasm ginge.

von S. Landolt (Gast)


Lesenswert?

> Ä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.

von Moby (Gast)


Lesenswert?

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 ;-)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von S. Landolt (Gast)


Lesenswert?

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?

von Yalu X. (yalu) (Moderator)


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

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