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

  • Kombiseminar Sachkundiger für Anschlagmittel und Traversensysteme (AnschlägerPlus)

    Mittwoch, 23. September 2026 – Freitag, 25. September 2026
  • Kombiseminar Sachkundiger für Anschlagmittel und Traversensysteme (AnschlägerPlus)

    Dienstag, 29. September 2026 – Donnerstag, 1. Oktober 2026
  • Sachkunde für Fliegende Bauten

    Dienstag, 29. September 2026 – Donnerstag, 1. Oktober 2026
  • Virtueller Stammtisch im Chat

    Dienstag, 29. September 2026, 21:00 – 23:00
  • PA-Forum Stammtisch LeatCon

    Dienstag, 6. Oktober 2026, 13:00 – 14:00

Letzte Themen

  1. 17. - 18. November | PA Rigging & Truss Safety mit Tom Greber

    Soundchecker
    23. September 2026 um 10:33
  2. 13. - 14. Oktober | Live Mixing Workshop mit Jörn Müller in Köln

    Soundchecker
    23. September 2026 um 10:30
  3. können das hier (Foto) die original Weichen der KMT CS215 / CM215 sein ?

    phattomatic
    23. September 2026 um 09:12
  4. RCF: "Bass Motion Control" vs. "XBoost" => Ähnliche Funktionalität unter zwei verschiedenen Etiketten oder relevante Unterschiede?

    Hanseat
    21. September 2026 um 22:21
  5. Suche Lichteffekt

    Schreddl
    21. September 2026 um 12:22
  6. QLC+4 in MagicQ Visualsieren - wie richtig einstellen?

    metal-shot
    19. September 2026 um 17:44
  7. Verschiedene Verteiler mit Powercon Anschluss bzw. Ausgang kompatibel?

    tenderboy
    19. September 2026 um 12:22
  8. Suche Optocore Spezialisten - trouble shooting eines SANE Verbunds

    georg.h
    19. September 2026 um 10:21
  9. Quick & dirty reverse engineering - wie gehts weiter?

    phlownd
    19. September 2026 um 10:13
  10. DSP Preset für The Box Pro TP218 MKIII

    dxnny074
    18. September 2026 um 15:16
  1. Datenschutzerklärung
  2. Impressum
Community-Software: WoltLab Suite™