Was ist an meinem code falsch? "prefetch: EIP [00010000] > CS.limit [0000ffff]"



  • an alle os-devs: 😉

    wollte mal fragen, warum mein code nicht klappt...

    .exec:
      mov di, [exec_buffer]
      call get_string
    
      mov ax, 0x2000
      mov es, ax
      xor bx, bx
      mov dl, 0
      mov ch, 0
      mov dh, 0
      mov cl, [exec_buffer] ; FEHLERQUELLE
      mov al, 1
      mov ah, 2
      int 0x13
    
      jmp 0x2000:0x0000
    
    get_string:
      xor cl, cl
    
    .loop:
      xor ah, ah    ; mov ah, 0
      int 0x16      ; wait for keypress
    
      cmp al, 8     ; backspace pressed?
      je .backspace ; yes, handle it
    
      cmp al, 13    ; enter pressed?
      je .done      ; yes, we're done
    
      cmp cl, 31    ; 31 chars inputted?
      je .loop      ; yes, only let in backspace and enter
    
      mov ah, 0x0E
      int 0x10      ; print out character
    
      stosb  ; put character in buffer
      inc cl
      jmp .loop
    
    .backspace:
      or cl, cl     ; zero? (start of the string)
      jz .loop      ; if yes, ignore the key
    
      dec di
      mov byte [di], 0  ; delete character
      dec cl        ; decrement counter as well
    
      mov ax, 0x0E08
      int 0x10      ; backspace on the screen
    
      mov al, ' '
      int 0x10      ; blank character out
    
      mov al, 8
      int 0x10      ; backspace again
    
      jmp .loop     ; go to the main loop
    
    .done:
      mov al, 0     ; null terminator
      stosb
    
      mov ax, 0x0E0D
      int 0x10
      mov al, 0x0A
      int 0x10      ; newline
    
      ret
    

    es kommt zwar unter nasm keine fehlermeldung, aber bochs sagt mir:
    "prefetch: EIP [00010000] > CS.limit [0000ffff]"

    weiss jemand, was falsch ist?



  • Möglicherweise sollte Zeile 2 anders lauten? Du kopierst die Adresse jedenfalls nach di, nicht von di. Wenn Zeile 2 doch richtig ist, wäre Zeile 11 zumindest ineffizient, ginge ja auch mov cl, di.



  • funktioniert leider immernoch nicht!



  • Die Fehlermeldung klingt meiner Ansicht nach eher so, als sollte beim Instruction Fetch ueber eine Segmentgrenze hinweg gelesen werden. Kann es sein, dass dein Code-Segment groesser als 64 KB ist, also die maximale Segmentgroesse im Realmode? Im Zweifelsfall mal ein paar groessere Prozeduren in eigene Segmente auslagern und dann Far-Jumps drauf machen.



  • ne, mein code-segment ist kleiner als 64kb...

    aber wenn ich sage mov cl, 2 anstatt mov cl, byte[di], dann funktioniert es auch!



  • Um das mal klarzustellen: Steht in [exec_buffer] ein sinnvoller Wert, wenn der o.g. Code aufgerufen wird? Was für ein Wert steht da drin?



  • ich habs mir grad mit print_string anzeigen lassen... wenn ich oben 2 eingebe, gibt print_string mir auch 2 zurueck. das heisst, cl muesste 2 sein, aber es funktioniert trotzdem nicht...

    bei 1 und bei 3 das gleiche, es gibt immer den richtigen wert zurueck.



  • Dieser Thread wurde von Moderator/in Erhard Henkes aus dem Forum Projekt: OS-Development in das Forum Assembler verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Ich denke einmal, dass der Fehler von der Null-Terminierung, die in Zeile 61 vorgenommen wird, ausgeht.

    Vielleicht funktioniert es, wenn du Zeile 61 einfach löscht.

    ...
    .done:
      mov al, 0 ; Diese Zeile streichen!!!
      stosb
    ...
    


  • kann es sein, dass du nicht den int-Wert der in steht exec_buffer kopieren möchtest, sondern die Startadresse von exec_buffer?
    Dann müsstest du die Klammern [exec_buffer] entfernen.


Anmelden zum Antworten