"Warmstart" vom 4. Byte?!

Gast #6916996
Lesenswert?

Liebe Leute,

möchte mir bitte jemand erläutern, wie es sich vorzustellen ist mit so 
einem Warmstart.
Wie soll der Code dafür siehe Listing 1, eigentlich erreicht werden?
1
nop
2
jmp near cold
3
nop
4
jmp near warm
5
; ...
6
cold:
7
; ...
8
warm:
9
; ...
Listing 1: Anfang des Codes von FIG-Forth in NASM, vgl. [1] und [2].

[1] FIG-FORTH for IBM-PC Page 1-3 
(http://www.forth.org/fig-forth/fig-forth_IBMPC.pdf Seite 4)

[2] fig-FORTH Installation Manual SCR # 12 
(http://wiki.yak.net/1089/fig-FORTH_Manuals_May79.pdf Seite 30)
#6917119
Lesenswert?

https://de.wikipedia.org/wiki/Microsoft_Macro_Assembler

Dem Datum im Forth-Text nach: "The IBM Personal Computer MACRO Assembler 
02-24-84"
muss es vor MASM 3.0 gewesen sein (Nov 84), MASM2.0 wurde zuletzt im 
Juli 84 geändert: https://bytepointer.com/masm/index.htm

Dunkel, Herr, ist Deiner Rede Sinn...
https://de.wikipedia.org/wiki/IBM_Cassette_BASIC
https://de.wikipedia.org/wiki/Maschinencode-Monitor
(Firma: Funkenflug Industries) #6917155
Lesenswert?

.COM-Programme (DOS) haben eine feste Einsprungadresse von CS:0100h. DOS 
macht rein gar nichts für das Programm, da wird nicht mal der 
Stackpointer gesetzt. Die Datei wird einfach komplett in freies RAM 
geladen und an CS:0100h angesprungen, mehr nicht. Heißt, ein PUSH AX am 
Anfang eines COM-Programms zerschießt das Programm bereits. In CS:0000h 
bis CS:00FFh finden sich bei DOS Umgebungsvariablen, z.B. die 
Kommandozeile.

Bei .EXE-Dateien kann eine Einsprungadresse definiert werden, die Datei 
kann eine Checksumme beinhalten (wobei die oft nicht ausgewertet wird), 
der Stack wird von DOS passend gesetzt. Die Umgebungsvariablen sind 
dadurch zugänglich, daß DS/ES 10h niedriger gesetzt werden als CS, da 
findet man durch die Speichersegmentierung des x86 diese 100h Bytes wie 
bei der .COM-Datei. Dazu kann man an eine .EXE noch irgendwelchen 
Overhead/Daten anhängen, der von DOS nicht mit in den Speicher geladen 
wird. Bestes Beispiel für sowas waren selbstextrahierende Archive.

Aber die Interrupttabelle hat damit nicht viel zu tun, die ist 
Prozessor- bzw. Plattform-spezifisch. Unter DOS z.B. hat das 
Überschreiben des ersten kB des Hauptspeichers einen sofortigen Absturz 
zur Folge, weil der x86 nicht ohne Interrupttabelle leben kann.
Gast #6917320
Lesenswert?

Ja, die Sprünge ganz am Anfang werden auf unterschiedliche Stellen in 
COLD (SCR # 55/S. 44) umgebogen.

 o Klar ist, dass der cold Vektor beim Starten ausgeführt wird, da er 
zuvorderst steht.

 o Nicht klar ist mir jedoch, wie Vektor warm jemals ausgeführt werden 
soll.

In FIG-Forth selbst habe ich keinen Verweis auf das vierte Byte bzw. 
104h entdeckt.
Einzig die Sache mit dem Monitor sehe ich als potenzielle Möglichkeit, 
verstehe sie allerdings noch nicht.
Gast #6917373
Lesenswert?

Der Warmstart wird von extern angesprungen, um Forth neu zu starten, 
ohne das Dictionary zu löschen.  Beispielsweise, um ein gerade laufendes 
Programm zu beenden - beim C64 wurde das per NMI (Restore-Taste) 
ausgelöst.  Btw, der Basic-Interpreter hatte auch so einen 
Warmstart-Einsprung.
Gast #6917387
Lesenswert?

Liese sich etwas Vergleichbares auch auf einem PC machen? Etwa mit dem 
ganz alten Cassette Basic und Forth auf Kassette. Oder wenn man von 
Forth aus COMMAND.COM ausführte und dann EXIT eingibt. Wo landet man 
dann?

Anbei, der mehr oder weniger selbe Assembler aus dem Installation Manual 
findet sich vom selben Autor in [1, p. 143ff/S. 11ff].

[1] Fourth Dimensions, Volume 3 Issue 5 
(http://forth.org/fd/FD-V03N5.pdf)
Gast #6917639
Lesenswert?

Günther A. D. Hauptmann schrieb:
> Liese sich etwas Vergleichbares auch auf einem PC machen? Etwa mit dem
> ganz alten Cassette Basic und Forth auf Kassette. Oder wenn man von
> Forth aus COMMAND.COM ausführte und dann EXIT eingibt. Wo landet man
> dann?

Was willst du erreichen? Hast du eine nackte Hardware mit deinem 
eingenen Code oder reden wir hier von einem normalen Legacy BIOS/UEFI PC 
mit Windows/Linux, es geht vieles nicht mehr auf neuerer 
Hardware/Betriebssystemen
Gast #6919828
Lesenswert?

Soweit ich das jetzt deuten kann, heißt Int 27h [1] in BYE [2, p. 
1-93/S. 94],
dass es irgendwie möglich ist, nach dem verlassen von Forth einen 
Warmstart desselben zu machen. Mangels Erfahrung mit TSR Programmen 
verstehe ich in CLD [2, p. 1-62/S. 64] leider nur den Kommentar, dass es 
wohl mit Ctrl-Break geht. Leider habe ich es weder in der DOSBox noch 
auf einem BIOS PC mit dieser FORTH.EXE (Quelltext in FORTH) [3] 
geschafft. Was muss ich dazu für Tasten drücken, oder wie geht das?

[1] https://www.ctyme.com/intr/int-27.htm

[2] http://www.forth.org/fig-forth/fig-forth_IBMPC.pdf

[3] 
http://www.forth.org/library/eforth_SOC/eforth_SOC_source/figforth/FIGFORTH.ZIP
Gast #6919979
Lesenswert?

Hättest Du möglicherweise die Güte, einmal mitzuteilen, was Du mit einem 
Forth von 1979 beabsichtigst? Soll das auf einem aktuellen PC laufen?
Möglicherweise kann man Dir dann besser helfen.
Was Deine Frage angeht: Entweder wird der Warmstart direkt über jmp 
angesprungen (wahrscheinlich) oder der erste jmp wird im RAM 
überschrieben (hier unwahrscheinlich). Die NOPs dienen wahrscheinlich 
zum Aligment auf durch 4 teilbare Adressen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren