www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Unterschied zwischne rjmp und jmp?


Autor: Jannik (Gast)
Datum:

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

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

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

Autor: Jannik (Gast)
Datum:

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

Autor: Michel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geschwindigkeitsvorteil.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

rjmp/rcall brauchen weniger Speicher, und sind schneller.

MfG Spess

Autor: Jannik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt..

Vielen dank und noch nen schönen abend

mfg

Autor: Itisnotabugitisafeature (Gast)
Datum:

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

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

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

Autor: spess53 (Gast)
Datum:

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

Autor: A. K. (prx)
Datum:

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

Autor: Itisnotabugitisafeature (Gast)
Datum:

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

Autor: er (Gast)
Datum:

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

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannst du dir doch selber bauen mit einem macro wenn dich das sooo stört 
;)

Autor: A. K. (prx)
Datum:

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

Autor: peter-neu-ulm (Gast)
Datum:

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

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
.include "m32def.inc"
.macro myjmp
  .if (@0 - PC < 1000)
    rjmp @0
  .else
    jmp @0
  .endif
.endmacro

.org 0xFFF
faraway:

.org 0x0
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!

Autor: peter-neu-ulm (Gast)
Datum:

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

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: A. K. (prx)
Datum:

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

Autor: Sven P. (haku) Benutzerseite
Datum:

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

Autor: spess53 (Gast)
Datum:

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

Autor: A. K. (prx)
Datum:

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

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja und? Damit kann ich doch dann den ganzen Programmspeicher 
anspringen...

Autor: A. K. (prx)
Datum:

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

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit einem Sprung über +-2k-Instruktionen kann man alle 4k-Instruktionen 
im Programmspeicher anspringen -- vielleicht reden wir aber tatsächlich 
aneinander vorbei :-)

Autor: Invers (Gast)
Datum:

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

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Doch, kann man... denk mal nich so beschränkt...hm, oder doch: denk mal 
beschränkt :-P

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: peter-neu-ulm (Gast)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Da ich mich praktisch nur auf dem atmega8 und auf dem atiny13 austobe,

Du weisst gar nicht, was du verpasst.

MfG Spess

Autor: Johannes M. (johnny-m)
Datum:

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

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.