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
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
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.
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?
@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.
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.
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
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.