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.