Hi
Ich erweitre gerade den Skrip-Interpreter meines Bootloaders und möchte gerne das Feature einbauen ein Segment, in welches vorher Daten geladen wurden, auszuführen.
Beispiel:
ld /reos/reos16.knl 3000
exec 3000
Die Datei reos16.knl wird in das Segment 0x3000 geladen, und soll anschließend ausgeführt werden
Bisher war das Ausführen hart im Code des Bootloaders - nach der Ausführung des Skriptes wurde call 0x3000:0x0000 ausgeführt.
Das würde allerdings in einem Chaos enden, falls jemand im Skript den Kernel in ein anderes Segment lädt.
Ein weiterer Nachteil ist, das nach dem Laden das Skript beendet werden muss, damit der call kommt. Beim runterfahren - also wenn der Kernel wieder verlassen wird, muss nun ein 2. Skript ausgeführt werden anstatt das 1. Skript nach einem exec weiter auszuführen.
Daher die Frage:
Wie kann ich in ein beliebiges Segment springen?
So sieht die Exec-Funktion aus:
[global _ExecSegment]
_ExecSegment:
push bp
mov bp, sp
push si
push di
push ds
push es
mov ax, [bp+4]
mov ds, ax
; call
pop es
pop ds
pop di
pop si
pop bp
ret
[bp+4] ist das Segment