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.
in AVR Studio ganz einfach: rjmp PC + 2 PC = Programmcounter. Ist aber auch in der Hilfe zu AVR Studio nachzulesen.
Danke Mikki, hast recht, steht in der Hilfe, war mal wieder zu blöde. gruss
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.