1. Home
  2. Chat
  3. Forum
  4. Kalender
    1. Termine
    2. Karte
  5. Lexikon
    1. Letzte Änderungen
  6. Marktplatz
    1. Bewertungen
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Artikel
  • Forum
  • Termine
  • Lexikon
  • Marktplatz-Eintrag
  • Seiten
  • Erweiterte Suche
  1. PA-Forum
  2. Forum
  3. Selbstbau
  4. Selbstbau und Reparatur Technik

Assembler: rjmp-Befehl

  • martinbreuer
  • 31. Mai 2007 um 18:50
  • martinbreuer
    Beiträge
    28
    • 31. Mai 2007 um 18:50
    • #1

    Hallo,

    ich habe eine assembler-frage: wie werden Befehle nach einem rjmp-Befehl ausgeführt?

    Code
    mainloop:
             loop: 
                      in r24, PIND
                      rjmp loop
    
    
    
    
                      ;wie werden diese folgenden Befehle ausgeführt?
    
    
    
    
                     inc r17
    Alles anzeigen

    Laut infos aus dem netz, wird rjmp loop immer wieder gelooped aber wie der nachfolgende Befehlssatz ausgeführt wird, hab ich bis jetzt nichts gelesen.

    Martin

  • Michael D
    Beiträge
    721
    • 31. Mai 2007 um 18:56
    • #2

    Gar nicht? Das is ja gerade der Sinn eines Jump Befehls irgendwohin zu springen. Wenn du den Befehl hinter einem jump nicht direkt anspringt wird er nie angeführt.

    http://www.digital-enlightenment.de/
    USB DMX Interface, Mediensteuerung, Demultiplexer, Multiplexer, Dimmer, Relaisboard, Art-Net

  • montesuma
    Beiträge
    948
    • 31. Mai 2007 um 19:30
    • #3
    Zitat von "Michael D"

    Gar nicht?

    Richtig, gar nicht! RJMP ist ein echter Sprungbefehl, der immer zum (in diesem Fall) "loop" springt.

    Der Unterschied zwischen RJMP und JMP ist nur die relative Addressierung des Sprungziels. Bei RJMP wird relativ um so und soviel Addressen nach hinten oder vorne gesprungen - egal in welchem Speicherbereich sich der Code befindet, beim JMP Befehl wird immer zu einer festen Addresse gesprungen.

    Somit kann man RJMP gut in Subroutinen verwenden, die von verschiedneen Stellen aufgerufen werden.

    Wenn Du willst, daß nach dem Sprung wieder an der selben Stelle weiter gehen soll, musst Du RCALL verwenden.


    Code
    mainloop: 
             loop: 
                      in r24, PIND 
                      rcall suby
    
    
    
    
                      ;hier gehts nach dem return weiter
    
    
    
    
                     inc r17
    Alles anzeigen
    Code
    suby:
    out PORTC,r24
    return   ; hier springt der PC (Program Counter) an die Stelle zurück, wo sich der letzte RCALL befehl befand

    Mit folgenden Code bringst Du also den Prozessor quasi zum Stillstand, indem nicht besonderes mehr ausgeführt wird:

    Zitat

    end:
    RJMP end

    Mit folgendem Code Zählst Du den Register r16 immer um eins höher:

    Code
    inc r16
    rjmp PC-1
  • martinbreuer
    Beiträge
    28
    • 31. Mai 2007 um 20:27
    • #4

    ok... dann muss davor noch ein anderer befehl, der diesen ignoriert... bei jeden zweiten etc. lauf.


    Martin

  • schrecki7289
    Beiträge
    7.887
    • 31. Mai 2007 um 20:47
    • #5

    Richtig.
    Was programmierst du denn genau mit Assembler?
    Bei Mikroprozessoren und -controllern ist C deutlich einfacher, man "sieht" allerdings nicht direkt was der Prozessor macht.

    Gruß
    Thomas

  • martinbreuer
    Beiträge
    28
    • 31. Mai 2007 um 21:27
    • #6
    Zitat von "Schrecki7289"

    Richtig.
    Was programmierst du denn genau mit Assembler?
    Bei Mikroprozessoren und -controllern ist C deutlich einfacher, man "sieht" allerdings nicht direkt was der Prozessor macht.

    dass man nicht sieht wo was zu welcher zeit in den registern etc. steht ist ein großer nachteil (vielleicht gibt es ja programme dafür...)

    mit assembler spiele ich grad nur so herum, um zu sehen zu was die sprache fähig ist; mein programm wird danach auch in c++ programmiert und nur bei bedarf mit assembler ergänzt... falls es schneller sein sollte, als mein c++ Code.

    die routine für mein obiges problem hab ich gefunden "sbrc";

    Martin

  • montesuma
    Beiträge
    948
    • 31. Mai 2007 um 22:57
    • #7

    Ach setzt weiss ich was Du willst.

    SBRS geht auch, skipt dann, wenn Bit "gesetzt" ist.

    Mit SBIC, SBIS kannst Du direkt mit dem Zustand im IO Register vergleichen, ohne es vorher in ein temp Register einlesen zu müssen...

    ...je nach dem mit welchem Prozessor Du arbeitest und welchen Befehlsasatz er noch kann.

    Code
    SBIC PIND,1                ;pin 1 vom D Port
    RJMP PC-1
    INC r17
  • mario scholz
    Beiträge
    28
    • 1. Juni 2007 um 02:38
    • #8
    Zitat von "MartinBreuer"

    dass man nicht sieht wo was zu welcher zeit in den registern etc. steht ist ein großer nachteil (vielleicht gibt es ja programme dafür...)


    Gibt es vermutlich... wenn ich mir das so angucke, sieht mir das ganz nach einem ATmega Prozessor aus. Da gibt es direkt von Atmel das AVR Studio (allerdings nur für Windows). Das enthält neben dem Assembler einen Simulator, und man kann mit WinAVR auch den C Compiler mit in die Entwicklungsumgebung einklinken und dann C-Code fast ganz genauso wie Assembler im Simulator durchtesten und auch die Registerwerte angucken. Natürlich weiß man dann häufig nicht sofort, welche Register der Compiler jetzt wofür verwendet hat, aber man kann auch im C-Code die Variableninhalte betrachten. Ist eigentlich sehr schön gemacht, nimmt einem sogar das Makefile ab.

    Von C++ würde ich übrigens absehen, das ist ja Hauptsächlich die objektorientierte Erweiterung von C, und Objektorientierung auf Mikrocontrollern ist wegen dem Speicher immer so eine Sache :)

    ~ Mario

  • schrecki7289
    Beiträge
    7.887
    • 1. Juni 2007 um 12:05
    • #9
    Zitat

    (vielleicht gibt es ja programme dafür...)


    Wie mein Vorredner schon sagte, der Debug Modus im Atmel AVR Studio eignet sich hervorragend dafür.

    Gruß
    Thomas

Anstehende Termine

  • Competent Person for Event Rigging according to IGVW SQQ 2 | Level 1 | Munich (English)

    Dienstag, 13. Oktober 2026 – Freitag, 23. Oktober 2026
  • Combined seminar for experts in lifting gear and lifting beam systems (AnschlägerPlus)

    Dienstag, 13. Oktober 2026 – Donnerstag, 15. Oktober 2026
  • Virtueller Stammtisch im Chat

    Dienstag, 13. Oktober 2026, 21:00 – 23:00
  • Sachkunde für Veranstaltungsrigging nach SQQ2 | Level 1 | Köln

    Donnerstag, 15. Oktober 2026 – Sonntag, 25. Oktober 2026
  • Kombiseminar Sachkundiger für Anschlagmittel und Traversensysteme (AnschlägerPlus)

    Donnerstag, 15. Oktober 2026 – Samstag, 17. Oktober 2026

Letzte Themen

  1. Seitlicher Balkon - wie kommt der Schall darunter?

    JeTo
    8. Oktober 2026 um 12:57
  2. Kölner Oper 8000 Mängel nach Kosten von 1.5 Mrd

    slaytalix
    8. Oktober 2026 um 06:30
  3. IHOS DSP 6.4 / Kingray GPA415 FIR Designer .txt Dateiformat?

    ThomasA
    5. Oktober 2026 um 19:16
  4. Neuer Mixer in Sicht: Behringer FLOWCASTER

    funkbrother
    5. Oktober 2026 um 16:21
  5. VI400/600 - Steuerung Local Rack über Mixing Station und Virtual VI ohne Surface?

    robert müller
    4. Oktober 2026 um 23:18
  6. Leatcon 2026 Forumstreffen

    skyper
    3. Oktober 2026 um 10:00
  7. Eminence Kappa 15 (LF) Bauvorschläge für Bassreflex oder Horn

    soundralf
    2. Oktober 2026 um 12:44
  8. Kleine PA und nur Fragen!!!

    Alex Bundschuh
    1. Oktober 2026 um 18:47
  9. Welche DI-Box/Line-Übertrager für Laptop/Kopfhörerausgang?

    wusel123
    30. September 2026 um 12:29
  10. Ersatzteilversorgung Lautsprecher (speziell Seeburg A3 MKII)

    Hanseat
    29. September 2026 um 18:25

Benutzer online in diesem Thema

  • 1 Besucher
  1. Datenschutzerklärung
  2. Impressum
Community-Software: WoltLab Suite™