Autor Thema: Problem mit CS bei JMP  (Gelesen 3506 mal)

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« 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??

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #1 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...
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #2 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

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #3 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...
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #4 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

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #5 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 ]
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #6 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
In the Future everyone will need OS-64!!!

RedEagle

  • Beiträge: 244
    • Profil anzeigen
    • RedEagle-OperatingSystem - Projekt
Gespeichert
« Antwort #7 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

 

Einloggen