Assembler RJMP x

Dieses Thema im Forum "Entwicklungsumgebung" wurde erstellt von LotadaC, 13. April 2015.

  1. LotadaC

    LotadaC Sehr aktives Mitglied

    Registriert seit:
    22. Januar 2009
    Beiträge:
    3.045
    Zustimmungen:
    54
    Punkte für Erfolge:
    48
    Sprachen:
    BascomAVR, Assembler
    Was bewirkt

    CodeBox Assembler
    RJMP x
    wenn für x irgendeine ganze Zahl eingesetzt wird?

    Atmel Studio 6.1.27.30 (SP2)
     
  2. TommyB

    TommyB Premium Benutzer

    Registriert seit:
    17. Mai 2010
    Beiträge:
    1.742
    Zustimmungen:
    60
    Punkte für Erfolge:
    48
    Sprachen:
    Assembler, LunaAVR, VB.Net, Python, C#
    Ich kann es grade nicht testen, ich hab's AVR Studio noch nicht wieder installiert. Aber soweit wie ich den Befehl verstanden habe (Opcode) navigiert der Befehlszeiger damit um x Bytes (oder Words) nach vorne bzw. hinten. Tendenziell oft mit Labels verwendet die der Compiler denn in die Positionen (Offsets) umsetzt.


    Ob der jetzt wirklich Bytegenau arbeitet oder in Words weiß ich nicht, ich vermute aber eher letzteres.
     
  3. LotadaC

    LotadaC Sehr aktives Mitglied

    Registriert seit:
    22. Januar 2009
    Beiträge:
    3.045
    Zustimmungen:
    54
    Punkte für Erfolge:
    48
    Sprachen:
    BascomAVR, Assembler
    Hustekuchen...

    Damit biste genauso reingefallen wie ich.
    Wenn man im Instruction Set nachliest (Dein Zitat), sollte es eigentlich so sein (words). insbesondere sollte

    CodeBox Assembler
    RJMP -1
    auf der Stelle hüpfen, 'ne leere Endlosschleife sein. Also dasselbe machen wie

    CodeBox Assembler
    loop:
     RJMP loop


    Würde man so erwarten.

    ABER die Zahl wird als absolute Zeilennummer (bzw Word-Adresse im Flash) interpretiert, nicht als Konstante "k" wie im Instruction Set angegeben, wobei unten bei null abgeschnitten wird...

    In der Onlinehilfe hatte ich dann auch einen Hinweis darauf gefunden, daß RJMP im Assembler mit labeln arbeitet - trotzdem gehört mMn etwas Fantasie dazu, konkrete Zahlen als Label einer Zeilennummer zu verstehen...
     
  4. TommyB

    TommyB Premium Benutzer

    Registriert seit:
    17. Mai 2010
    Beiträge:
    1.742
    Zustimmungen:
    60
    Punkte für Erfolge:
    48
    Sprachen:
    Assembler, LunaAVR, VB.Net, Python, C#
    Tatsache, da ist der Assembler wohl etwas missverständlich geschrieben.


    Also RJMP PC-1 statt RJMP -1
    Denn soll der Assembler das als relativ interpretieren.

    So leicht kann man sich täuschen 0.o
     
  5. LotadaC

    LotadaC Sehr aktives Mitglied

    Registriert seit:
    22. Januar 2009
    Beiträge:
    3.045
    Zustimmungen:
    54
    Punkte für Erfolge:
    48
    Sprachen:
    BascomAVR, Assembler
    Nein...
    Eigentlich erwartet RJMP absolute Entfernung und Richtung zur derzeitigen Position, also eine relative Adresse
    Der Opcode ist dann 1100 kkkk kkkk kkkk (also die Konsante als vorzeichenbehaftete (Zweierkomplement) 12bit Zahl)

    Von der Adresse wo das RJMP steht, soll (k+1)-weit gesprungen werden. Also relativ.
    So war das auch mal.

    Der Assembler trägt jetzt aber eben nicht mehr k (als Zahl) ein, sondern macht auch aus'ner Zahl irgend'n Label. In der Onlinehilfe findet man dazu dann lediglich zusätzlich
    D.h. er interpretiert k jetzt als absolute Adresse (Word im Flash). Wobei alles kleiner als null dann als Null interpretiert wird. Dein (PC-x) wird berechnet, und dann als absolute Adresse verwertet (und ggf vorher bei null abgeschnitten). RJMP PC-0 springt auf der Stelle.

    Laut InstructionSet müßte RJMP k für k=0b111111111111 dann 1100111111111111 als Opcode ergeben, also 0xFFCF (little endian).
    Je nach Flash-Adresse in der das RJMP steht kommt aber was anderes raus, zB 0xFEC1 (Little endian, also 1100000111111110)
     
    #5 LotadaC, 13. April 2015
    Zuletzt bearbeitet: 23. September 2018
  6. dino03

    dino03 Aktives Mitglied

    Registriert seit:
    27. Oktober 2008
    Beiträge:
    6.695
    Zustimmungen:
    14
    Punkte für Erfolge:
    38
    Sprachen:
    BascomAVR, Assembler
    Hi,

    kenne ich auch so. Es sollte nach dem Opcode eine Zahl im Zweierkomplement stehen die dann die Differenz zum Zielbefehl angibt.
    Der ProgramCounter (PC) steht allerdings normalerweise bei der Ausführung des RJMP schon auf dem nächsten Befehl im Flash.
    So kenne ich das auf jeden Fall vom Z80. Bei einem RJMP 0 sollte also nichts passieren und einfach der nächste Befehl ablaufen.
    Das wäre dann sozusagen ein komplizierter "NOP". ;) Die Differenz bezieht sich also auf die Adresse des auf den RJMP folgenden Befehl.

    Gruß
    Dino
     
  7. LotadaC

    LotadaC Sehr aktives Mitglied

    Registriert seit:
    22. Januar 2009
    Beiträge:
    3.045
    Zustimmungen:
    54
    Punkte für Erfolge:
    48
    Sprachen:
    BascomAVR, Assembler
    Wie gesagt, eigentlich...
    Das Atmel Studio (zumindest meine Version) interpretiert aber eben die Konstante k nicht (mehr, abweichend vom alten Instruction Set) als relative Sprungadresse, sondern als absolute Flash-Adresse, und berechnet dann quasi das Opcode-k daraus. Der Sinn dahinter erschließt sich mir nicht. (Da man so immer mit Labeln arbeiten muß, wenn irgendwo vor dem Sprungziel was geändert werden könnte. Solange das echt relativ wäre, würden lediglich Änderungen zwischen RJMP und Ziel problematisch sein, beim RJMP -1 also nicht...).

    egal, kannst Du trotzdem mal checken, ob das auch in den alten Studio-Versionen schon so war, Dino?
    Müßtest ja nur mal

    CodeBox Assembler
    NOP
    RJMP -1
    NOP

    durch den jeweiligen Simulator jagen - wenn er auf das erste NOP jumpt, wars auch schon da so, wenn er auf der Stelle hüpft nicht...

    (Ich hab hier derzeit keine alten Studio-Versionen)
    Nachtrag:
    Richtig, deswegen ja auch
     
  8. dino03

    dino03 Aktives Mitglied

    Registriert seit:
    27. Oktober 2008
    Beiträge:
    6.695
    Zustimmungen:
    14
    Punkte für Erfolge:
    38
    Sprachen:
    BascomAVR, Assembler
    Hi,

    öhhhmmm ... Den Simulator hab ich noch nie angepackt :eek:
    Ich weiß nur das ich mal beim RJMP im Studio4 ne Meldung über ein Sprungziel außerhalb der Reichweite des Befehls bekommen hab. ;)

    Gruß
    Dino
     
  9. LotadaC

    LotadaC Sehr aktives Mitglied

    Registriert seit:
    22. Januar 2009
    Beiträge:
    3.045
    Zustimmungen:
    54
    Punkte für Erfolge:
    48
    Sprachen:
    BascomAVR, Assembler
    kannst ja auch auf den Simulator verzichten, und Dir die erzeugten Opcodes ansehen. Die 3 Instruktionen sollten nach dem Instruction Set
    Code:
    00 00 FF CF 00 00 ...
    ergeben - meine Version erzeugt da halt was anderes als FF CF...
    (in Intel Hex rechne ich das jetzt aber nicht um - dafür ist entschieden zu wenig Coffein im Hirn...)
     
  10. LotadaC

    LotadaC Sehr aktives Mitglied

    Registriert seit:
    22. Januar 2009
    Beiträge:
    3.045
    Zustimmungen:
    54
    Punkte für Erfolge:
    48
    Sprachen:
    BascomAVR, Assembler
    Um das ganze mal abzuschließen:
    Die AVR arbeiten mit Prefetch - während eine Instruktion abgearbeitet wird, wird bereits die nächste in den Decoder geladen (bzw das nächste Word einer Doppelwort-Instruction). Folglich ist bereits der Program-Counter inkrementiert.

    Deswegen würde ein "echter"

    CodeBox Assembler
    RJMP k
    nach PC+k+1 springen.


    CodeBox Assembler
    RJMP -1
    würde also auf der Stelle springen.
    Der Assembler des ATMEL/AVR-Studios verarbeitet aber keine numerischen Konstanten, sondern absolute Label (und berechnet dann korrekt die relativen Konstanten).

    Will man (zB bei Macros) auf Label verzichten, kann man den Program Counter selbst verwenden. Allerdings korrigiert der Assembler hier das Prefetch selbst.


    CodeBox Assembler
    RJMP PC
    springt auf der Stelle, also PC+0 statt PC-1.

    Neben RJMP betrifft das ganze natürlich ebenso RCALL und die ganzen Conditional Branches.

    P.S.: selbst in der aktuellen L-Version des Instruction Sets von 11/2016 fehlt der Hinweis auf die Label, bzw steht der falsche Syntax mit "RJMP k"
     
  • Über uns

    Unsere immer weiter wachsende Community beschäftigt sich mit Themenbereichen rund um Mikrocontroller- und Kleinstrechnersysteme. Neben den Themen Design von Schaltungen, Layout und Software, beschäftigen wir uns auch mit der herkömmlichen Elektrotechnik.

    Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  • Coffee Time

    Unser makerconnect-Team arbeitet hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und unser eigener makerconnekt-Server regelmäßig gewartet wird. Wir nehmen das Thema Datensicherung und Datenschutz sehr ernst und sind hier sehr aktiv, auch sorgen wir uns darum, dass alles Drumherum stimmt!

    Dir gefällt das Forum und die Arbeit unseres Teams und du möchtest es unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft, unser Team freut sich auch über eine Spende für die Kaffeekasse :-)
    Vielen Dank!
    Dein makerconnect-Team

    Spende uns! (Paypal)
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren und die Seite optimal für dich anzupassen. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden