- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 6 von 6

Thema: register retten

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    04.05.2007
    Beiträge
    16

    register retten

    Anzeige

    Praxistest und DIY Projekte
    Hi, ich hab' da mal ne frage
    und zwar geht es um folgende Passage aus einem Beispielprogramm:
    Code:
    initm16: push   r16         ;Register retten
                 ldi      r16,$ff
                 out     DDRB;r16;
                 pop    r16          ;Register zurück
                 ret
    was ich nicht ganz verstehe - was sollen diese Befehle push und pop eigentlich bewirken?Im Buch habe ich leider keine vernünftige Antwort gefunden,in der Wiki auch nicht.
    und überhaupt - wie kann man ein Register retten? und vor allem wovor?
    kann mir das jemand bitte kurz erklären?
    vielen dank schonmal im voraus

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.12.2004
    Ort
    LEV
    Beiträge
    505
    Hallo,

    der Assembler Befehl PUSH <Register> legt den Inhalt des Registers
    auf dem Stack ab. (Stichwort: LIFO)
    Der POP <Register> Befehl tut genau das Gegenteil, er lädt
    den obersten Wert vom Stack in das Register.
    Der Hauptzeck dieser Befehle ist das temporäre "Retten" von Registerinhalten,
    weil der Inhalt später noch gebraucht wird.

    In deinem Codebeispiel wird der Inhalt von R16 mit PUSH R16 auf den Stack gerettet.
    Dann wird R16 mit dem Wert $FF geladen um dies nach DDRB auszugeben.
    Anschliessend wird mit POP R16 der alte Wert von R16 wiederhergestellt.

    Gruß Jan

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.12.2004
    Alter
    39
    Beiträge
    165
    Das Register wird vor der Aenderung gerettet.

    push legt den Wert des Registers ganz oben auf den Stack. (google hilft)
    Dann wird irgendwas mit dem Register gemacht, es bekommt einen neuen Wert. Dieser neue Wert wuerde jedoch das Hauptprogramm "verwirren".
    Am Ende des Teilprogramms holt deshalb der Prozessor per pop den vorher gespeicherten Wert des Registers zurueck und versetzt das Register somit in den "Ausgangszustand".

    Man soll seinen Arbeitsplatz ja immer so verlassen wie man ihn vorgefunden hat.

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Also:
    Es gibt im Speicher ein Bereich, das heißt "Stack", und ist meistens ganz oben in der freien Memory (=Speicher)
    Dazu gibt's auch einen Zeiger, (Stackpointer), der zu Beginn mit der OBERSTEN Adresse von diesem Bereich geladen wird.
    So.
    Wenn man nun ein Register "retten" will, d.h. man will den Inhalt sichern, weil man dieses Register eine Zeitlang für was anderes braucht (Manche Subroutinen tun sowas) sagt man laut und deutlich "PUSH register"
    Die CPU subtrahiert nun 1 von dem "Stackpointer" und schreibt den Inhalt des Register dorthin, wo der "Stackpointer" nun hinzeigt.
    Nun kann man ohne gewissenbisse das Register vernudeln.
    Recht's einem, sagt man "POP register"
    Die CPU kopiert nun den Wert von dort, wo der Stackpointer hinzeigt, wieder ins register und addiert 1 auf den Pointer.
    Nun ist wieder alles so, wie es Vor dem PUSH war.
    Klaro ?
    Weil das also ein "FIrst-in Last-Out" Speicher ist, sind im Code PUSH und POP gewissermassen gespiegelt drin, z;b,
    Code:
       PUSH r1    retten (=save)
       PUSH r2    retten (=save)
       CALL  subroutine    ;(die kann nun diese beiden register für sonstwas verwenden)
      POP   r2     wiederherstellen (=restore)
      POP   r1     wiederherstellen (=restore)
    ; jetzt ist alles wie vorher
    *lufthol*

    hilft dir das ?


    EDIT:
    @fluchtpunkt: sorry
    @janb auch sorry, ich war wohl am langsamsten
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.12.2004
    Alter
    39
    Beiträge
    165
    dafuer warst du am ausfuehrlichsten

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    04.05.2007
    Beiträge
    16
    @janb
    @fluchtpunkt
    @PicNick
    vielen Dank für eure schnellen und ausführlichen Antworten.
    jetzt hab ichs endlich geschnallt.

    gruss alex

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad