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 3000Die 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