Unterschied zwischne rjmp und jmp?

Gast #1126062
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
Gast
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
Gast
>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..
Persönliche Seite
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
Gast
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
Gast
@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?
Gast
> 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.
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.
Gast
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
Persönliche Seite
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!
Gast
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.
Persönliche Seite
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)
Gast
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...
Gast
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
Gast
Mit einem Sprung über +-2k-Instruktionen kann man alle 4k-Instruktionen 
im Programmspeicher anspringen -- vielleicht reden wir aber tatsächlich 
aneinander vorbei :-)
Gast
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.
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.
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.