Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: RedEagle am 28. January 2006, 21:28
-
; . . .
REOSCONSOLE:
mov si, msg_prompt
call fnc_writestring
mov ah, [opt_cmdcolor] ; Farbe für den command
mov al, [opt_paramcolor] ; " " die Parameter
call fnc_getcommand
mov si, cmd_test
call fnc_cmpcmd ; 0 wenn gleich
jz fnc_cmd_test ;;HIER GIBTS DAS PROBLEM
jmp REOSCONSOLE
;;;;;;;;;,,,,,,,,,;;;;;;;;;;;;
ENDLESS:
jmp ENDLESS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; FUNKTIONEN ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
fnc_cmpcmd:
mov di, cin_command
call fnc_strcmp
or al, al
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
fnc_cmd_test:
ret
; . . .
Hi wenn ich zur funktion "fnc_cmd_test" springen möchte, gibts bochs folgende Meldung aus:
[CPU0 ] prefetch: RIP > CS.limit
woran liegt das??
wie bringe ich das zum laufen??
-
Sorry, aber deine Angaben sind ein bisschen dürftig :wink:
Der Fehler tritt halt dann auf, wenn der Instruction Pointer größer ist als das Limit im Deskriptor des Codesegments. Mehr kann ich dir so auch nicht sagen. Vllt GDT/LDT angeben...
-
Dieser teil des OSs läuft im RealMode. Bis auf die sache mit dem A20Gate habe ich vorher nichts großartiges gemacht. Die größe der binary beträgt 1.5 KB
-
Dann könnte es sein, dass dein Instruction Pointer eine 64kb Grenze überschreitet. Bin mir da aber nicht sicher. Müsstest halt den IP aus dem Bochs log anschaun...
-
00356892916i[CPU0 ] | EIP=00010000 (0000ffff)
so stehts im log-file...
Wie kann ich das verhindern??
ich lade den kernel an 1000:0
mov ax, 0x1000 ; ES:BX = 1000:0
mov es, ax
mov bx, 0
d.h. mein Kernel darf noch ~60 KB groß sein
-
naja, du musst dann auch noch zur "richtigen" Adresse springen...
[edit: Und dir vllt. das real mode memory model anschaun... :P ]
-
Na ja, du springst mit einem Jump zur Funktion und willst mit ret zurückspringen. Das geht aber nicht. Du musst die Funktion call aufrufen, die den Offset des nächsten Befehl auf den Stack schreibt. Ret holt dann diesen vom Stack und springt dort hin. Aber bei dir holt er sich ein Wert vom Stack der gar kein Offset ist. Also springt er falsch.
bitmaster
-
Na ja, du springst mit einem Jump zur Funktion und willst mit ret zurückspringen. [...]
#-o Soooooooo ein blöder Fehler... :oops:
DANKE