Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: RedEagle am 28. January 2006, 21:28

Titel: Problem mit CS bei JMP
Beitrag 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??
Titel: Problem mit CS bei JMP
Beitrag von: bluecode am 28. January 2006, 23:16
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...
Titel: Problem mit CS bei JMP
Beitrag von: RedEagle am 29. January 2006, 00:11
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
Titel: Problem mit CS bei JMP
Beitrag von: bluecode am 29. January 2006, 00:26
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...
Titel: Problem mit CS bei JMP
Beitrag von: RedEagle am 29. January 2006, 08:34
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
Titel: Problem mit CS bei JMP
Beitrag von: bluecode am 29. January 2006, 16:00
naja, du musst dann auch noch zur "richtigen" Adresse springen...

[edit: Und dir vllt. das real mode memory model anschaun... :P ]
Titel: Problem mit CS bei JMP
Beitrag von: bitmaster am 29. January 2006, 20:47
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
Titel: Problem mit CS bei JMP
Beitrag von: RedEagle am 30. January 2006, 14:19
Zitat von: bitmaster
Na ja, du springst mit einem Jump zur Funktion und willst mit ret zurückspringen. [...]

#-o Soooooooo ein blöder Fehler...  :oops:

DANKE