Autor Thema: jmp-Befehl???  (Gelesen 5180 mal)

Cheebi

  • Beiträge: 91
    • Profil anzeigen
    • Cheebis Webseite
Gespeichert
« 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
0100 1001 0100 1100 0100 0001 0010 0000 0011 1010 0010 1101 0010 1010
http://www.cheebi.de

faulancer

  • Beiträge: 4
    • Profil anzeigen
Gespeichert
« Antwort #1 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

__OS_coder

  • Beiträge: 69
    • Profil anzeigen
Gespeichert
« Antwort #2 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

faulancer

  • Beiträge: 4
    • Profil anzeigen
Gespeichert
« Antwort #3 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 =)

__OS_coder

  • Beiträge: 69
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 19. July 2006, 23:40 »
Kein problem ;) Ich bin ja da um zu helfen XD

 

Einloggen