Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: Cheebi am 18. July 2006, 03:03

Titel: jmp-Befehl???
Beitrag 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
Titel: jmp-Befehl???
Beitrag von: faulancer am 18. July 2006, 03:11
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
Titel: jmp-Befehl???
Beitrag von: __OS_coder am 18. July 2006, 17:39
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
Titel: jmp-Befehl???
Beitrag von: faulancer am 19. July 2006, 11:53
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 =)
Titel: jmp-Befehl???
Beitrag von: __OS_coder am 19. July 2006, 23:40
Kein problem ;) Ich bin ja da um zu helfen XD