Benutzer-Werkzeuge

Webseiten-Werkzeuge


words:kernel_embedded:stack:to-r

>R

Forth wurde als 2-Stack-Maschine entwofen. Es gibt den Daten- und den Returnstack. Auf dem Returnstack wird die Liste der auszuführenden Forthworte geführt, die dort meist in der Form von Adressen liegen. Vorübergehend können aber auch Daten auf den Returnstack ausgelagert werden. Das Wort >R1) erledigt dies.

Die Daten müssen aber von dort wieder zurück auf den Datenstack geholt werden. R>2) muss also ausgeführt worden sein, bevor die Definition mit NEXT verlassen wird um zum nächsten Forthwort zu kommen. So werden >r und r> immer als Paar benutzt. Sie können also nur innerhalb einer Definition verwendet werden. 3)

Das Paar >r und r> wird immer maschinenabbhängig implementiert. Der Stackpointer kann in Registern oder Uservariablen liegen. Es gibt keinen sicheren Weg in high level forth diesen ReturnstackPointer RP zu manipulieren.

Gleichwohl kann auch der Returnstack innerhalb einer Definition auf forthige Weise gefahrlos gelesen und geschrieben werden - wenn man darauf achtet, seine Daten oberhalb der nächsten Adresse zu halten, und zum Schluß auch wieder zu entfernen. RP@ liefert die aktuelle Adresse des TOP of ReturnStack. 4)

  
: rtest1 ( x1 x2 -- x1 x2 )
  cr rp@ . rp@ @ . ( R: -- next address)
  >r
  cr rp@ . rp@ @ .
  >r
  cr rp@ . rp@ @ .
  r>
  cr rp@ . rp@ @ .
  r>
  cr rp@ . rp@ @ .  ( R: -- next address)
  cr .s ;
  
: rtest2 ( x1 x2 -- x1 x2 )
  cr rp@ . rp@ @ .
  >r
  cr rp@ . rp@ @ .
  >r
  cr rp@ . rp@ @ .
  44 rp@ ! 
  cr rp@ . rp@ @ .
  55 rp@ ! 
  cr rp@ . rp@ @ .
  r>
  cr rp@ . rp@ @ .
  r>
  cr rp@ . rp@ @ .
  cr .s ;
1)
sprich: to-r
2)
sprich: r-from
3)
Nur in dem Fall, dass eine gültige Adresse auf den returnstack gelegt wird, kann Forth weiter machen. NEXT würde dann als nächstes dorthin gehen.
4)
Beachte das CELL von System zu System variiert. In Gforth ist CELL=4 und daher erhöht oder erniedrigt sich die Addresse um 4, wenn Daten auf den Stack gelegt, oder von dort genommen werde.
words/kernel_embedded/stack/to-r.txt · Zuletzt geändert: 2010-12-29 18:12 von 127.0.0.1