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


von Jannik (Gast)


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

von Läubi .. (laeubi) Benutzerseite


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.

von Jannik (Gast)


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

von Michel (Gast)


Lesenswert?

Geschwindigkeitsvorteil.

von spess53 (Gast)


Lesenswert?

Hi

rjmp/rcall brauchen weniger Speicher, und sind schneller.

MfG Spess

von Jannik (Gast)


Lesenswert?

Stimmt..

Vielen dank und noch nen schönen abend

mfg

von Itisnotabugitisafeature (Gast)


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

von Μαtthias W. (matthias) Benutzerseite


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

von spess53 (Gast)


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

von (prx) A. K. (prx)


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.

von Itisnotabugitisafeature (Gast)


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?

von er (Gast)


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.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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

von (prx) A. K. (prx)


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.

von peter-neu-ulm (Gast)


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

von Läubi .. (laeubi) Benutzerseite


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:
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!

von peter-neu-ulm (Gast)


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.

von Läubi .. (laeubi) Benutzerseite


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.

von Karl H. (kbuchegg)


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)

von (prx) A. K. (prx)


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.

von Sven P. (Gast)


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

von spess53 (Gast)


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

von (prx) A. K. (prx)


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.

von Sven P. (Gast)


Lesenswert?

Ja und? Damit kann ich doch dann den ganzen Programmspeicher 
anspringen...

von (prx) A. K. (prx)


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?

von Sven P. (Gast)


Lesenswert?

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

von Invers (Gast)


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.

von Sven P. (Gast)


Lesenswert?

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

von Johannes M. (johnny-m)


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.

von peter-neu-ulm (Gast)


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.

von Johannes M. (johnny-m)


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...;-)

von spess53 (Gast)


Lesenswert?

Hi

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

Du weisst gar nicht, was du verpasst.

MfG Spess

von Johannes M. (johnny-m)


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

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
Noch kein Account? Hier anmelden.