-
        

Ergebnis 1 bis 5 von 5

Thema: wiso Registerwerte im Stack ablegen

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.06.2006
    Beiträge
    473

    wiso Registerwerte im Stack ablegen

    Anzeige

    Hallo an alle,

    ich lese gerade ein TUT zu Assambler. Dort wird beschrieben, wie ich einen Registerwert in den Stack schreibe. Ich versteh den Sinn dahinter nicht ganz, da sich der Stack doch im RAM befindet. Also warum solte ich Werte in den Stack statt in den RAM schreiben und mich so an das LIFO Prinzip binden?

    Danke,
    The Man

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    Stack ist nur für eine kurze Zwischenspeicherung um z.B. Rücksprungadressen dort abzulegen,Registerinhalte oder SREG beim betreten einer ISR zu sichern usw.
    Oder um ein Register eben auseinanderzunehmen, ohne seinen Inhalt zu verlieren, Beispiel:
    Code:
    push R16
    andi R16,0xF0
    out PORTB,R16
    pop R16
    andi R16,0x0F
    out PORTB,R16
    Sehr beliebt um im 4Bit Modus ein Display anzusteuern.

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    07.07.2006
    Ort
    Mannheim
    Beiträge
    454
    Brauchst du nicht, wenn du keine Unterprogramme oder Interrupts verwendest. An sonsten hat izaseba eigentlich schon alles gesagt. Vielleicht solltest du dich mal über Rücksprungadressen schlau machen.

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    19.01.2006
    Ort
    Mönchengladbach
    Beiträge
    544
    Meiner Meinung nach ist der Stack ein extrem wichtiger Bestandteil einer Prozessorarchitektur und deshalb es Wert verstanden zu werden.
    Im Bereich der x86 wird der Stack fast immer zur Parameterübergabe an Unterprogramme und Interrupthandler verwendet. Siehe folgenden Link:
    http://de.wikipedia.org/wiki/Aufrufkonvention
    Das kann man auch bei den AVRs machen... auch wenn sich die Register für Parameterübergabe anbieten.

    Nun zur Frage, warum man die Register nicht im RAM speichert:
    Der Stack ist selbsständig in der Lage die Werte an der richtigen Adresse zwischen zu speicher... einfaches Beispiel:
    Du hast ein Unterprogramm, daß die Register in festgelegten Speicherstellen ablegt... was passiert, wenn das Unterprogramm sich selbst aufrufen möchte: Es überschreibt die alten Registerwerte mit den nun aktuellen Werten. Das ist ein Problem. Bei einem Mikrocontroller wird man allerdings selten rekursive Programmteile verwenden, da es sehr leicht zu einem Buffer-Overflow (hier:Stack) kommen kann. Allerdings kann es Probleme geben, wenn mehrere Interrupthandler den selben Zwischenspeicher verwenden würden. Interrupts können nämlich verschachtelt werden.

    Gruß,
    SIGINT

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    34
    Beiträge
    1.780
    Außerdem sollte man mit dem Stack umgehen können, wenn man C und Assembler kombinieren möchte.

    also z.B. um eine in ASM geschriebene Funktion aus C aufzurufen oder umgekehrt, denn da werden die Argumente der Funktion über den Stack übergeben.
    So viele Treppen und so wenig Zeit!

Berechtigungen

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