LDS und der Stackpointer

OP Persönliche Seite #552727
Also wenn ich folgenden Befehl verwende:
1
lds r17, SPL;
lädt er dann die Daten auf die der Stackpointer gerade zeigt in Register 
17?
Ich interpretiere zumindest so das Datenblatt so:
LDS Rd, k Load Direct from SRAM Rd ← (k)
Oder lädt er dann von Adresse (0x3d) also der Andresse in der .def 
datei??
Irgendwie ist mir das nicht ganz klar.
Gast
Hallo,

Deine 2. Annahme ist richtig, er holt den Wert aus SPL

(k) ist eine 16Bit-Speicheradresse, SPL ist eine Assemblervereinbarung, 
es wird also SPL durch den Wert der Zuweisung in der .def ersetzt.

Was Du mit 1. meinst, wäre wohl indirekt indizierte Adressierung, die 
kann der AVR nicht, indirekt kann er, ld r17,Z  als Beispiel.

Gruß aus Berlin
Michael
Gast
es passiert zweiteres (mit "direct" ist bei Speicheraddressierung 
gemeint, dass der Befehl selbst die Adresse enthält - lds, sts brachen 
beim AVR auch 32Bit statt 16)
wenn du an die Daten kommen willst, auf die der Stackpointer zeigt nimm 
"pop", oder kopier den Stackpointer in einen anderen Pointer (X, Y, Z) 
und nimm "ld", aber ob das sinn ergibt?!
Gast
du musst bei 32 Registern noch Daten über den Stack übergeben ?
sonst evtl. die Rückkehraddresse und die Daten 'poppen' und 
anschließend die Addresse (vom R/CALL) wieder 'push'en (man könnte auch 
mit IJMP zurückkehren, aber ....)
mit lds und sts kanst du direkt deine Werte ins SRAM legen, mit pop und 
push geschied das ja nur Stapelweise also "first in last out". Ich nutze 
das bei mir so so muss ich mir um die genaue Speicheradresse im SRAM 
keine Gedanken machen, nur zum nem Stack Überlauf darf es halt nicht 
kommen.

.include "tn26def.inc"
.def  temp  =R16
.def  temp2  =R17
.def  temp3  =R18
.def  temp4  =R19

.DSEG  ;Reserve jeweils 1 Byte / Variable eim SRAM
Wert1:  .byte  1
Wert2:  .byte  1
Wert3:  .byte  1
Wert4:  .byte  1

.cseg
....
....
lds temp, Wert1  ;Lade Wert aus SRAM ins temp Register
rol temp
sts Wert2, temp ;Speichere Wert aus temp Register ins SRAM an andere 
Adresse
Gast
>jeder PC regelt so die Variablenübergabe...
aber nur (noch) wenn's nötig ist, die x86 (genauer IA-32 oder AMD64) 
haben auch genug register, aber normalerweise ist das Compilerabhängig
Ich mache das zum Beispiel so ähnlich , um feste nullterminierte Texte 
aus dem Flash auf LCD/Bildschirm auszugeben. Die Routine wird dadurch 
zwar etwas aufwändiger, der Aufruf dafür um so einfacher.
1
outtext:    pop ZH        ;Rücksprungadresse vom Stack holen
2
            pop ZL
3
            lsl ZL        ;*2 da wir Bytes wollen
4
            rol ZL
5
            ...           ;Daten über Z+ lesen, bei 0x00 abbrechen
6
            lsr ZL        ;/2 da Befehle wortweise organisiert sind
7
            rol ZH
8
            ijmp          ;Rücksprung
Um jetzt einen Text auszugeben, reicht folgender Aufruf:
1
            rcall outtext
2
            .db "Hallo Welt",0x00
Falls sich eine ungerade Anzahl an Bytes ergibt, wird das normalerweise 
vom Assembler (ich benutze avra) mit 0x00 aufgefüllt.

Eine Parameterübergabe über den Stack ist auch möglich, ich finde es 
aber besser, dafür einen eigenen Stack über eines der drei Indexregister 
X,Y,Z einzurichten, da man auf diese Weise auch leichter feststellen 
kann, wieviele Parameter auf dem Stack abgelegt wurden.

Gruß Jörg

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.