Hi,
nu hab ich mich extra wegen so nem dummen Fehler hier angemeldet
Hoffentlich könnt ihr mir helfen.
Es geht um folgendes:
Ich schreibe gerade mein eigenes OS (wie wohl viele hier
).
Da man natürlich auch Programme laden können sollte, habe ich eben soetwas impletiert.
Die Sachlage:
Ich lade hiermit ein programm an 07c0h:1a00h
mov al,1
mov ah,05h
lea bx,[programm]
int 21h
(Das sind eigene Int Funktionen)
Dann will ich an diese Stelle springen, aber nicht irgendwie, sondern CS muss die physikalische Adresse im RAM von 07c0h:1a00h haben und der IP muss 0h haben.
Also hab ich mal schnell die physikalische Adresse berechnet:
07c0h*16+1a00h=9600h
Dann mach ich also einen far Call dahin.
call 9600h:0h
Aber da hängt sich dann Bochs in einer Endlosschleife auf und in der Logdatei steht tausendmal:
00060811446i[CPU0 ] LOCK prefix unallowed (op1=0x1, attr=0x300, mod=0xc0, nnn=6)
Yo, das LOCk ein Befehl iss, weis ich, aber dieser Befehl kommt in dem geladenen Programm überhaupt nicht vor:
programm:
mov ah,0h
mov al,"!"
int 21h
jmp $
wenn ich das Programm ganz normal anspringe, mit:
call 1a00h
funktioniert es.
wie kann ich also CS richtig laden?
btw, noch eine Frage:
Ich lese des öfteren, dass man im RealMode keine 32 Bit Register verwenden kann.
Stimmt das? Weil zumindest dieser TEstcode:
inc si
lodsd
mov ebx,1400h
mov dword edx,[bx]
add bx,4
cmp eax,edx
JE asdfg
lief unter Bochs und einem sehr altem Notebook.
Da ich nicht vor habe, in den PM zu schalten, die Bearbeitung von DWords bei der Stringbearbeitung aber doch angenehmer ist, als Wordweises bearbeiten, hätte ein 32 Bit Modus doch einige Vorteile...