mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RJMP relativ eingeben


Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: thkaiser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: mikki merten (Gast)
Datum:

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

Autor: Markus (Gast)
Datum:

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

gruss

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: mikki merten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.