RJMP relativ eingeben

Gast #18040
Lesenswert?
• ▲
▼
Hallo

meine Frage bezieht sich auf Assembler für AVR BasicLine

Gibt es die Möglichkeit die relative Sprungadresse im Befehl <rjmp> 
anstatt mit einem Label "numerisch" einzugeben ?

Bsp:  IST      SOLL

  nop      nop
  rjmp Label1     rjmp +0x0002 ;springe zwei Zeilen
  nop      nop
  nop      nop
Label1: ldi r16,0    ldi r16,0
  nop      nop

Im List-File wird die relative Sprungadrese über das Label ja in der 
gezeigten Form umgewandelt, müßte doch auch direkt gehen.
(Beim PIC16F84 geht es zumindest ;-) )

Vielen Dank fürHilfe

gruss
markus
Gast #18041
Lesenswert?
• ▲
▼
Ach Scheiße, wurde ja alles "kaputt" formatiert, soll heißen

"numerisch" einzugeben ?

So ist es einzugeben :

  nop
  rjmp Label1             nop
  nop
Label1: ldi r16,0
  nop

so möchte ich es eingeben:

  nop
  rjmp +2 ;sringe zwei Zeilen weiter         nop
  nop
        ldi r16,0
  nop

gruss markus
Gast #18045
Lesenswert?
• ▲
▼
bleibt die Frage, warum du das machen willst?? Gerade das ist es doch, 
was einem der Assembler abnimmt, ständig Adressen selbst berechnen zu 
müssen. Welchen Vorteil versprichst du dir davon?
Gast #18046
Lesenswert?
• ▲
▼
@crazy horse: um zum Beispiel die Symboltabellen zu entrümpeln. Es gibt 
auch Stellen an denen ein Sprunglabel zwar nicht schadet, aber doch 
nicht unbedingt der Übsichtlichkeit dient. Und wem das nicht gefällt, 
der verzichtet einfach darauf.
Gast #18047
Lesenswert?
• ▲
▼
Na ja, ich weiß nicht. Wenn man so was erst mal anfängt, muß man bei 
jeder kleinen Programmänderung höllisch aufpassen, ob sich nicht doch 
ein byte zwischen Sprungbefehl und Ziel schiebt.
Ich habe noch nie ein Pronblem mit zu großen Symboltabellen gehabt.
Gast #18048
Lesenswert?
• ▲
▼
Hallo
brauchte es für ein Macro.

>snip<
.macro ist_x_groesser_neu_y ;x=PortX y=rY
cpi r19,@0+1
brsh PC + 3 ; an dieser Stelle kann ich nicht mit Label arbeiten
hierauf bezog sich meine Anfrage

ldi r18,@1
rjmp start
.endmacro

>snip<

in r19,PINX

ist_x_groesser_neu_y 10,12
;ist r19<=10 schreibe 12 in r18
;ist r19 > 10 gehe zum nächsten Macro

ist_x_groesser_neu_y 25,24
ist_x_groesser_neu_y 156,77
ist_x_groesser_neu_y 245,65
usw...

Solange ich die Reihenfolge einhalte (erster Parameter aufsteigend) und 
nichts zwischen die Macro-Aufrufe reinschreibe
dürfte es keine Probleme geben.

Arbeite erst seit 2 Tagen mit Assembler, davor AVRs nur mit BASCOM 
programmiert.
Meine Lösung ist deshalb bestimmt recht umständlich, aber es läuft.


gruss
markus
Gast #18049
Lesenswert?
• ▲
▼
ja, das ist ein Argument, daß ich verstehen kann.  Ich habe aber schon 
ewig nichts mehr mit ASM gemacht, wahrscheinlich gibts dafür eine 
elegantere Lösung. Beim 8051-Assembler (ist das lange her :-)), konnte 
man Makro-Sprungmarken mit einem %-Zeichen kennzeichnen, der Assembler 
hat dann bei jedem Makroaufruf dort das Symbol verändert und damit 
einmalig gemacht. Vielleicht weiß ja hier einer, ob das beim 
AVR-Assembler auch irgendwie geht. Aber bei Makro-Programmierung hält 
sich der Aufwand für ein selbstberechnetes Sprungziel auch in Grenzen, 
allzuoft kommt es in Makros ja auch nicht vor.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.