Das Wort dump listet Werte aus dem RAM auf.
Beginnend bei der Startadresse holt es aufsteigend Byte für Byte aus dem Speicher und zeigt diese zeilenweise an. Anschließend werden die ASCII-Werte der selben Bytefolge angezeigt. Es wird immer mindestens eine ganze Zeile angezeigt. Die Darstellung der Werte erfolgt passend zur verwendeten Zahlenbasis wie sie in der Uservariablen base
abgelegt ist. Die Länge der Zeile ist modulo base
, was die Orientierung erleichtert. Das Lineal über der Liste zeigt die Position in der Zeile an.
Für spezielle Microprocessor Systeme macht man sich am besten selbst die passenden Helfer. Als Beispiel sei idump edump dump für das amforth (AVR atmega) wieder gegeben.
\ Berechnet vorzeichenlose Werte. \ (Bei Systemen in denen Forth auf hohen Adressen liegt liefert ein einfaches MOD falsche Ergebnisse.) : umod ( u1 u2 -- umod ) 0 swap um/mod drop ; : .ruler ( addr -- ) base @ 0 do i over + base @ umod cell .r loop 2 spaces base @ 0 do i over + base @ umod 1 .r loop drop ; \ Druckbare Zeichen ausgeben, sonst nur einen Punkt ausgeben. \ Ein gesetztes Bit8 soll dabei ignoriert werden. : .ascii ( c -- ) $7F and dup $20 < if drop $2E then emit ; : dump ( addr n -- ) cr 3 cells 1+ spaces over .ruler 0 ?do cr dup 3 cells u.r space base @ 0 do i over + c@ cell .r loop space base @ 0 do i over + c@ .ascii loop key? if leave then base @ + base @ +loop cr drop ;
Das Wort dump wird gewöhnlich in der Entwicklungsphase von Programmen eingesetzt, um code zu debuggen und zu verifizieren. Besonders wenn Maschinencode auf Mikroprozessoren eingebunden werden soll, ist es hilfreich.
Je nach verwendetem Mikroprozessor Typ ist es erfolderlich, dump
anzupassen. So soll beispielsweise ein flash oder eeprom Bereich gedumpt werden. Dann muss c@
ersetzt werden durch die passende Operation für den Speichertyp. Auch kann es sein das Speicherbereiche nicht in Bytes sondern in Zellen (cell
) organisiert sind.
Gewöhnlich werden solche tools wie dump
nicht in der Applikation belassen, werden aber immer wieder benötigt bei den verschiedenen Entwicklungen. Darum hat es sich eingebürgert, solch ein tool am Stück zu codieren, um nicht Gefahr zu laufen die preprozessierten Teile zu verlieren, oder inkompatible Teile zu laden. Drum hier der Code nochmal als Modul.
: dump ( addr n -- ) over \ print a ruler cr 3 cells 1+ spaces base @ 0 do i over + base @ 0 swap um/mod drop cell .r loop space base @ 0 do i over + base @ 0 swap um/mod drop 1 .r loop drop \ dump bytes 0 ?do cr dup 3 cells u.r space \ print line of bytes base @ 0 do i over + c@ cell .r loop space \ print same bytes in ascii again base @ 0 do i over + c@ $7F and dup $20 < if drop $2E then emit loop key? if leave then base @ + base @ +loop cr drop ;