Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: Cheebi am 18. July 2006, 03:03
-
Hallo,
ich habe eine Frage zu dem Asm-Befehl:
jmp 08h:01000h
im PM. Was soll die HEX-Acht da? Hier hab ich einen Code, den ich von irgendner Seite geklaut habe. (Ich bitte um Entschuldigung!)
... PM geschaltet ...
jmp 08h:clear_pipe ; Jump to code segment, offset clear_pipe
[BITS 32] ; We now need 32-bit instructions
clear_pipe:
mov ax, 10h ; Save data segment identifyer
mov ds, ax ; Move a valid data segment into the data segment register
mov ss, ax ; Move a valid data segment into the stack segment register
mov esp, 090000h ; Move the stack pointer to 090000h
jmp 08h:01000h ; Jump to section 08h (code), offset 01000h
Nun... warum stellt man da eine HEX-Acht davor? Was für ein Segment soll die denn Angeben?? Ich habe doch nur EIN Code- und EIN Data-Segment in der GDT angegeben:
NULL_DESCRIPTOR:
dd 0 ; Alle Werte mit Null füllen
dd 0
CODE_DESCRIPTOR:
dw 0FFFFh
dw 0
db 0
db 09ah
db 0cfh
db 0
DATA_DESCRIPTOR:
dw 0FFFFh
dw 0
db 0
db 092h
db 0cfh
db 0
HILFE!!!
Gruß Cheebi
-
Hi,
das Segment wird nicht als Nummer angegeben, sondern als Speicherstelle in der GDT.
Für jeden Descriptor werden 8 byte benötigt, also errechnet sich das Segment wie folgt:
Segment = EintragnummerImGDT * 8
-
naja... so ähnlich ein... Selector besteht aus 16bit.. und ist wie folgt aufgebaut:
bit 0 Table Indikator (auswählen ob sich der Index auf GDT oder LDT bezieht)
bit 1-2 Requested Privilege Level ( Welches Privileglevel gewünscht ist; DPL wird mit RPL verlichen )
bit 3-15 Index in der GDT
Also wird der Selector schon als Nummer angegeben.. nur liegt dieser Index 3 bits nach links verschoben... daher ergibt sich für dein Codesegment die 0x8
-
oha, da habe ich wirklich lange einem Irrglauben unterlegen. Gut das du mich berichtigt hast, hat mir auf jedenfall geholfen, als sich mein Taskhandler geweigert hat in ein DPL3-Segment zu springen =)
-
Kein problem ;) Ich bin ja da um zu helfen XD