Hallo zusammen, Ich habe neu mit der uC-Programmierung begonnen und nun habe ich eine wahrscheinlich relativ doofe Frage, doch ich weiss nicht was der Unterschied zwischen rjmp und jmp oder auch rcall und call ist! Egal welchen Befehl ich ins Programm schreibe, es ändert ja nichts an der Funktion...? Kann mir jemand weiterhelfen? Mfg Jannik
rjmp/rcall kann nur eine bestimmten (relativen) Offset überspringen, call/rcall können den gesamten Programmspeicher erreichen. Ansosnten falsches Forum... !!PC!!! Programmierung heißt dieser Bereich.
Vielen Dank für die schnelle Antwort! Und wegen den Forum, werden PC nicht gleich programmiert wie uC's? Naja was solls tut mir Leid das ich das falsche Forum erwischt habe..:) Noch ne letzte Frage: Wieso gibt es denn überhaupt rjmp? Man könnte ja immer jmp nehmen? mfg
Hi rjmp/rcall brauchen weniger Speicher, und sind schneller. MfG Spess
>Noch ne letzte Frage: Wieso gibt es denn überhaupt rjmp? Man könnte ja >immer jmp nehmen? Bei anderen Architekturen erldigt das normalerweise auch der Assembler durch automatische Sprungweitenanpassung aber bei Atmel und seinem hochqualifizierten Personal hat sich das eben bis heute noch nicht herumgesprochen..
Hi Von Assemblerprogrammen erwartet man im allgemeinen das sie genau so in der Maschine ablaufen wie man sie hinschreibt. Wenn der Assembler jetzt aber eigenmächtig einen jmp/call gegen einen rjmp/rcall ersetzt ändert sich das Laufzeitverhalten je nach Sprungweite. Das will man nicht wenn man in Assembler programmiert nicht unbedingt. Etwas anderes ist es wenn der Prozessor gar kein jmp kennt (wie etwa der 8051 (ja es gibt jmp @A+DPTR den wir jetzt mal wissentlich ignorieren)). Da gibt es (zumindest einen) Assembler der dann anstatt jmp automatisch ajmp, ljmp oder sjmp verwendet. Dann hat sich der Programmierer aber bewusst dafür entschieden als er den nicht vorhandenen Befehl jmp verwendet hat. Matthias
Hi >Bei anderen Architekturen erldigt das normalerweise auch der Assembler >durch automatische Sprungweitenanpassung aber bei Atmel und seinem >hochqualifizierten Personal hat sich das eben bis heute noch nicht >herumgesprochen.. Blödsinn. Zum einen gibt es bei einener ganzen Reihe von AVRs schon mal gar kein 'jmp'. Zum anderen habe ich mich für Assembler entschieden, damit solche 'Egenmächtigkeiten' in meiner Hand liegen. In dieser Beziehung (und in anderen auch) ist der AVR-Assembler ganz OK. MfG Spess
Jannik wrote:
> Und wegen den Forum, werden PC nicht gleich programmiert wie uC's?
Abstrakt gesehen ja, aber bei der Frage nach 2 ganz konkreten Befehlen
nicht, schon weil die bei PCs anders heissen.
@Matthias Weißer @spess53 Haha, ihr seid vielleicht Experten. Arbeitet ihr bei Atmel? Schon mal darüber nachgedacht, dass so etwas bei anderen Assemblern optional gehandelt wird? Bei Atmel gibt es logische Befehle die physisch denselben Code bilden. Was spricht also dafür, keinen dritten Jmp-Befehl einzuführen?
> Was spricht also dafür, keinen dritten Jmp-Befehl einzuführen?
Wie oben geschrieben, mit dem 'dritten' Befehl gibt man einen Teil
der Kontrolle aus der Hand bzw. holt den Zufall mit ins Boot, dann
kann man auch gleich C nehmen.
Kannst du dir doch selber bauen mit einem macro wenn dich das sooo stört ;)
Es hängt sehr vom Assembler ab, ob es damit überhaupt möglich ist. Innerhin muss eine Distanzabfrage drinstehen, von dessen Ergebnis der ausgewählte Sprung abhängt. Im ersten Durchlauf des Assemblers ist die Distanz aber nicht bekannt, folglich unklar ob ein 1-Wort oder 2-Wort Befehl erzeugt werden muss. Ein 2-Pass-Assembler kann das also vorwärts nicht wirklich leisten. Es gibt allerdings sehr wohl Assembler, die Sprungoptimierung durchführen. Was ich in meinen Assemblern auch einzubauen pflege, denn der Assembler kann das besser als der Programmierer und m.E. ist es auch sein Job. Wer darauf Wert legt, dass exakt die von ihm gewünschte Codierung gegeniert wird, der kann diese dann dann auch explizit auswählen. Letztlich ist das aber nichts anderes als die auch bei anderen Prozessoren mit variabler Befehlslänge übliche vom Assembler automatisch ausgewählte Codierung. Beispielsweise kann der x86-Befehl ADD AX,3 auf 3 verschiedene Arten codiert werden: accumulator immediate, 8bit sign extended immediate, full size immediate. Weshalb verschiedene PC-Assembler aus dem gleichen Quellcode manchmal verschiedenen Binärcode erzeugen.
In der Syntax der -51 Prozessoren gilt: rjmp ist ein zwei-Byte-Befehl: Opcode + Argument von 8 Bit Als Argument für einen rjmp-befehl dient ein Byte, die mögliche Sprungweite ist also auf 128 Adressen vor- zurück begrenzt. jmp ist ein 3-Byte-Befehl: Opcode + Argument von 16 Bit Der jmp Befehl hat 2 Byte Argument, ermöglicht also eine wesentlich größere Sprungweite von 128 x 256 Adressen vo-zurück. Als 3-Byte-Befehl läuft er natürlich langsamer ab als der 2-Byte- Befehl rjmp. Dass bei der Syntax des AVR rjmp nicht enthalten ist, ist wohl ein Mangel: der führt oft zur Fehlermeldung : Sprungweite zu groß,- dann braucht es Klimmzüge mit Hilfslabel oder den ijmp-Befehl mit Z-register
peter-neu-ulm wrote: > Dass bei der Syntax des AVR rjmp nicht enthalten ist, ist wohl ein > Mangel: der führt oft zur Fehlermeldung : Sprungweite zu groß,- dann > braucht es Klimmzüge mit Hilfslabel oder den ijmp-Befehl mit Z-register Hä? Wenn der AVR jmp hat hat er auch rjmp. jmp ist nur nicht verfügbar wenn der AVR eh nicht soviel Flash hat als das man es einsetzen müßte... Nur bei den conditional branches hat man manchmal das Problem... btw:
1 | .include "m32def.inc" |
2 | .macro myjmp |
3 | .if (@0 - PC < 1000) |
4 | rjmp @0 |
5 | .else |
6 | jmp @0 |
7 | .endif |
8 | .endmacro |
9 | |
10 | .org 0xFFF |
11 | faraway: |
12 | |
13 | .org 0x0 |
14 | myjmp faraway |
sowas geht schon... einziges Manko: Das angegebene Label muß vor dem Aufruf bekannt sein. Man kann im Assembler nur einstellen das relative Sprüngen ggf auch "umgebrochen" werden falls der Sprung unter ausnutzung des überlaufes möglich ist. Wo ich gerade so lese... stellt mal unter den Assembler Optionen die zusatzoption: -vs ein. Der Assembler spruckt dan eine "usage" statistik von Befehlen und Registern aus!
Tut mir leid, ich hab mich vertippt, und statt rmp rjmp geschrieeben. Es ist aber so: jmp fehlt im AVR-Instruction-Set. Für Maschinensprache gilt also: Sprünge weiter als 128 sind nur mit Hilfslabel oder über ijmp machbar. Dass der C- Compiler diesen Befehl zu Verfügung stellt, ändert nichts an der Sache, vor Allem, wenn man präzise Laufzeiten erzielen will.
peter-neu-ulm wrote: > jmp fehlt im AVR-Instruction-Set. Für Maschinensprache gilt also: > > Sprünge weiter als 128 sind nur mit Hilfslabel oder über ijmp machbar. Auch ohne Tippfehler stimmt dies nicht! Es gibt sehr wohl eine jmp Befehl. Und der relative kann 2k +/- Addressieren! >Relative jump to an address within PC - 2K +1 and PC + 2K (words). [...] >For AVR microcontrollers with program memory not exceeding 4K words >(8K bytes) this instruction can address the entire memory from >every address location. d.h. Auf allen Devices mit 4K Flash ist der (absolute) jmp schlicht nicht nötig und meist dann auch nicht verfügbar.
peter-neu-ulm wrote: > Tut mir leid, ich hab mich vertippt, und statt rmp rjmp geschrieeben. Es > ist aber so: > > jmp fehlt im AVR-Instruction-Set. Kannst du das belegen? Im offiziellen Instruction Set aller AVR ist ein JMP sehr wohl enthalten. Es mag sein, dass auf deinem konkreten Prozessor der JMP nicht zur Verfügung steht. Dies deshalb, weil dein Flash so klein ist, dass JMP und RJMP effektiv dasselbe machen und es daher keine NOtwendigkeit für einen JMP gibt (sprich der komplette Speicher ist mit RJMP erreichbar)
peter-neu-ulm wrote: > jmp fehlt im AVR-Instruction-Set. AVRs mit mehr als 8KB Flash besitzen diesen Befehl. > Sprünge weiter als 128 sind nur mit Hilfslabel oder über ijmp machbar. RJMP erfasst +/-4KB.
A. K. wrote: > peter-neu-ulm wrote: > AVRs mit mehr als 8KB Flash besitzen diesen Befehl. > >> Sprünge weiter als 128 sind nur mit Hilfslabel oder über ijmp machbar. > > RJMP erfasst +/-4KB. Nicht ganz, der hat zwar 8k Programmspeicher, aber da passen nur 4k Instruktionen, da die mindestens zwei Bytes belegen. Darum muss ja bei LPM auch immer schön die Adresse verdoppelt werden...
Hi >Tut mir leid, ich hab mich vertippt, und statt rmp rjmp geschrieeben. Es >ist aber so: >jmp fehlt im AVR-Instruction-Set. Für Maschinensprache gilt also: >Sprünge weiter als 128 sind nur mit Hilfslabel oder über ijmp machbar. >Dass der C- Compiler diesen Befehl zu Verfügung stellt, ändert nichts an >der Sache, vor Allem, wenn man präzise Laufzeiten erzielen will. Also Wie du zu der Aussage kommst ist mir schleierhaft. Dass Instruction-Set kennt 3 verschieden 'Sprünge'(ausser IJMP): BR.. -64...+63 RJMP -2k..+2k JMP Innerhalb von 4M MfG Spess
Sven P. wrote: >> RJMP erfasst +/-4KB. > > Nicht ganz, der hat zwar 8k Programmspeicher, aber da passen nur 4k > Instruktionen, da die mindestens zwei Bytes belegen. Eben. Und deshalb sind deine +/-2K Befehle meine +/-4KB.
Ja und? Damit kann ich doch dann den ganzen Programmspeicher anspringen...
Ja eben. Ich versuche immer noch herauszukriegen, was dein "nicht ganz" bedeutet. Dein RJMP springt +/-2KW, meiner +/-4KB, was nach meiner Rechnung identisch ist. Worin also wolltest du mich oben korrigieren?
Mit einem Sprung über +-2k-Instruktionen kann man alle 4k-Instruktionen im Programmspeicher anspringen -- vielleicht reden wir aber tatsächlich aneinander vorbei :-)
Nein, kann man nicht. wenn da am Anfang vom Speicher stehst, kannst du nicht ans Ende springen, es geht nur wenn man genau in der Mitte ist, alles zu erreichen.
Doch, kann man... denk mal nich so beschränkt...hm, oder doch: denk mal beschränkt :-P
Invers wrote: > Nein, kann man nicht. wenn da am Anfang vom Speicher stehst, kannst du > nicht ans Ende springen, Doch, kann man. Vom Anfang zum Ende ist sogar sehr nah, nämlich nur (minus) eine Adresse... > es geht nur wenn man genau in der Mitte ist, alles zu erreichen. Nö. Es gibt etwas, das man Überlauf nennt, und das kann auch der Programmzähler.
Hoppla! Da ich mich praktisch nur auf dem atmega8 und auf dem atiny13 austobe, habe garnicht gemerkt, dass es im AVR-Instruction-Set tatsächlich den jmp-Befehl auch gibt. Ich zieh' mich mit roten Ohren zurück und mach' es das nächste mal besser.
peter-neu-ulm wrote: > Ich zieh' mich mit roten Ohren zurück und mach' es das nächste mal > besser. Also wirklich! Ab in die Ecke! Schäme er sich...;-)
Hi
>Da ich mich praktisch nur auf dem atmega8 und auf dem atiny13 austobe,
Du weisst gar nicht, was du verpasst.
MfG Spess
spess53 wrote: > Hi > >>Da ich mich praktisch nur auf dem atmega8 und auf dem atiny13 austobe, > > Du weisst gar nicht, was du verpasst. Genau. Es ist ja nicht nur jmp, nein, es gibt beispielsweise auch noch call...
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.