% Content-encoding: UTF-8 \documentclass[ngerman]{article} \usepackage[utf8]{inputenc} \usepackage{multicol} % \usepackage{babel} \usepackage{xspace} \setcounter{secnumdepth}{0} \setcounter{tocdepth}{0} \usepackage{german} %\newcommand{\code}[1]{\texttt{#1}} %\newcommand{\ret}{\textsf{$<$ret$>$}\xspace} %\newcommand{\ret}{$\hookleftarrow$\xspace} \renewcommand{\reftextbefore}{auf der vorherigen Seite} \renewcommand{\reftextfacebefore}{auf der gegenüberliegenden Seite} \renewcommand{\reftextafter}{auf der nächsten Seite} \renewcommand{\reftextfaceafter}{auf der gegenüberliegenden Seite} \renewcommand{\reftextfaraway}[1]{auf Seite \pageref{#1}} \renewcommand{\figurename}{Listing} \title{Über Flags in Forth} \ifx\shorttitle\undefined\else \shorttitle{Über Flags in Forth} \fi \author{Fred Behringer} % \begin{document} \vfill \maketitle Willi Stricker hat in einer sehr interessanten Arbeit [S1] gezeigt, wie man mit lediglich 26 Primitives (Code--Definitionen) ein Forth--System hochziehen kann, das im Übrigen nur High--Level--Worte enthält. (Eine ähnliche Arbeit zum Thema ist die bekannte Internet--Notiz von Bernd Paysan [BP]. Weitere Arbeiten zum Thema: [RA],[FB].) Willi Stricker benötigt zum Aufbau der Colon--Definition \texttt{d+} aus Low-- und High--Bestandteil das Carry--Flag. \emph{In Forth gibt es keine Flags.} (Wirklich? Implizit schon!) Willi Stricker führt eigens für dieses Problem \texttt{+c} in seinen Basis--Satz von Primitives ein, aus welchem man sich neben dem carry--Flag auch das übliche \texttt{+} (per High--Level--drop) herausholen kann. Das carry--Flag ist implizit in \texttt{d+} enthalten! Albert Nijhof hat gezeigt [AN], wie carry aus \texttt{d+} herausgeholt werden kann. \texttt{+c} ist in Forth unüblich und nimmt sich überdies als unverzichtbares Basis--Wort (Primitive) etwas fremd aus. Ich zeige im gleich folgenden Listing, dass man \texttt{+c} (mit allen Strickerschen Eigenschaften) als Colon--Definition fassen kann, wenn man statt seiner \texttt{d+} als Primitive aufnimmt. Ich beschränke mich auf einen PC--Kompatiblen mit einem Prozessor ab 80486. Aus \texttt{+c} als Colon--Definition kann man (siehe Listing) neben carry auch \texttt{+} genau so herausholen wie in Willi Strickers Kernel--Vorschlag angegeben. Ansonsten wird \texttt{+c} in Willi Strickers Kernel nicht weiter benötigt und es fällt daher leicht einzusehen, dass durch diesen Austausch (\texttt{+c} Kernel, \texttt{d+} Primitive statt \texttt{+c} Primitive, \texttt{d+} Kernel) nichts verloren ist. Gewonnen wird: \texttt{d+} ist in Forth--Systemen üblich, \texttt{+c} nicht. \section{Quellen} \begin{tabular}{lp{15cm}} [AN] &Nijhof, Albert: E--Mail an [FB], wiedergegeben in Übersetzung. Vierte Dimension 1/2006, S.10.\\ [BP] &Paysan, Bernd: Beitrag 'aus dem Netz', besprochen in [RA].\\ [FB] &Behringer, Fred: Drei Primitives weniger in Willi Strickers Forth--Minimalbasis. Vierte Dimension 4/2009.\\ [RA] &Allwright, Ray: From the Net -- Minimal Word Sets. Forthwrite (FIGUK) 95, März 1998.\\ [S1] &Stricker, Willi: Minimaler Basis--Befehlssatz für ein Forth--System. Vierte Dimension 3/2009.\\ [S2] &Stricker, Willi: Von der virtuellen Forth--Maschine zum realen Forth--Prozessor. Vierte Dimension 4/2010. \end{tabular} \newpage \section{Listing} \begin{quote} \begin{listing}{1} hex : opsize: 66 c, ; \ Praefix, das aus ax (16 Bit) eax (32 Bit) macht usw. code d+ ( d1 d2 -- d1+d2 ) \ Alles Punktzahlen (doppelt genau) ax pop \ d2-hi bx pop \ d2-lo cx pop \ d1-hi dx pop \ d1-lo cx push \ d1-hi dx push \ d1-lo ax push \ d2-hi bx push \ d2-lo opsize: ax pop \ d2-lo..hi im Reg eax (little endian) opsize: bx pop \ d1-lo..hi im Reg ebx (little endian) opsize: ax bx add \ d1+d2-lo..hi im Reg ebx (little endian) opsize: bx push \ d1+d2-lo..hi auf den Stack (vom TOS her nach oben) ax pop \ d1+d2-lo von dem Stack bx pop \ d1+d2-hi von dem Stack ax push \ d1+d2-lo auf den Stack bx push \ d1+d2-hi auf den Stack \ Jetzt liegt d1+d2-hi..lo auf dem Stack (vom TOS her nach oben) next end-code \ Man haette auch mit (dem ueber opsize: erweiterten) Assembler-Befehl rol \ arbeiten koennen. \ Bildung der Summe zweier einfachgenauer Ganzzahlen n1 und n2 mit Anzeige \ des Uebertrags, carry (= 0 oder 1). carry ist der Inhalt des carry-Flags \ NACH der Operation + in +c. Nicht zu verwechseln mit adc (add WITH carry), \ das das carry-Flag VOR Beginn der Operation zum Ergebnis der Operation \ addiert. Das carry-Flag interpretiert n1 und n2 als vorzeichenlos, so wie \ es beim Zusammenstueckeln der Addition zweier doppeltgenauer Zahlen aus \ zwei Additionen aus je zwei einfachgenauen Zahlen benoetigt wird. : +c ( n1 n2 -- n1+n2 carry ) >r 0 r> 0 d+ ; \ Und um die Sache perfekt zu machen, noch schnell die +-Operation aus +c \ heraus, jetzt als Colon-Definition: : + ( n1 n2 -- n1+n2 ) +c drop ; \ Das stimmt mit dem Kernel-Vorschlag von Willi Stricker [S2] ueberein. Man \ pruefe nach, dass alle Ergebnisse richtig herauskommen, und ueberlege sich, \ warum. \end{listing} \end{quote} \end{document}