Forum: Mikrocontroller und Digitale Elektronik RJMP relativ eingeben


von Markus (Gast)


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

von Markus (Gast)


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

von thkaiser (Gast)


Lesenswert?

Moin,

So sollte es gehen:

nop
rjmp PC+2
nop
ldi r16,0
nop


"PC" wird vom Assembler durch die aktuelle Adresse ersetzt - zumindest 
steht das so in der Anleitung.

von mikki merten (Gast)


Lesenswert?

in AVR Studio ganz einfach:
rjmp  PC + 2
PC = Programmcounter. Ist aber auch in der Hilfe zu AVR Studio 
nachzulesen.

von Markus (Gast)


Lesenswert?

Danke Mikki,
hast recht, steht in der Hilfe, war mal wieder zu blöde.

gruss

von crazy horse (Gast)


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?

von mikki merten (Gast)


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.

von crazy horse (Gast)


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.

von Markus (Gast)


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

von crazy horse (Gast)


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.

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.