Aktív témák

  • OddMan

    őstag

    válasz kisfurko #30 üzenetére

    Nagyon köszi, hogy segítesz.

    ''Ne tedd 0f0000h-ra a programod, mert ott a BIOS van...''
    Szereztem egy valós modú memória térképet, és most már tudom, hogy hova lehet töltögetni.

    ''A jmp far-t heggeszteni kell:
    db 0eah ;ez a jmp far abszolut címre kódja
    dw uj_ip,uj_cs
    Értelemszerűen, az IP legyen 32 bites, ha 32 bites kód fut.''
    Na a nasm-ban a ''jmp dword cs:ip'' 32bit-es és ''jmp word cs:ip'' 16bit-es far ugrás.
    Megnéztem az exe-t hexa editorral és úgy néz ki, hogy a nasm jól fordítja le ezeket az utasításokat. Te próbáltad már a nasm-ot? Mert ha mégsem fordítja jól, akkor az álltalad írt gépikód formát fogom használni. Meg gondolom bizonyos esetekben kell a 66h prefix, amikor a szegmens 16bit-es az utasítás meg 32bit-es.

    Más:
    Azt értem, hogy az lgdt utasításnak fizikai cím kell, de azt már nem, hogyan kell azt megkapni.

    mov eax, ds
    shl eax, 4 ;ezt nem értem, hogyha 4-el balra léptetem a biteket, akkor mitől lesz az a fizikai címe a DS-nek? :F
    add [GDT_ptr+2], eax
    lgdt [GDT_ptr] ;Load the GDT


    GDT_addr:
    ;;0. descriptor
    NULL_SEL equ $-GDT_addr
    dw 0
    dw 0
    db 0
    db 0
    db 0
    db 0

    ;;1. descriptor (code segment 1MB 0-nál kezdődik)
    CODE16_SEL equ $-GDT_addr
    dw 0FFFFh ;a szegmens hosszának alsó wordja (határ)
    dw 0 ;a báziscím alsó wordje
    db 0 ;a báziscím felső wordjének alsó bájtja
    db 10011010b ;P=1, DPL=00, S=1, C/D=1, C/E=0, R/W=1, A=0
    db 00001111b ;G=0, D/B=0, AVL=0, reserved=0, határ=1111
    db 0 ;a báziscím felső wordjének felső bájtja

    ;;2. descriptor (data segment 1MB 0-nál kezdődik)
    DATA16_SEL equ $-GDT_addr
    dw 0FFFFh ;a szegmens hosszának alsó wordja (határ)
    dw 0 ;a báziscím alsó wordje
    db 0 ;a báziscím felső wordjének alsó bájtja
    db 10010010b ;P=1, DPL=00, S=1, C/D=0, C/E=0, R/W=1, A=0
    db 00001111b ;G=0, D/B=1, AVL=0, reserved=0, határ=1111
    db 0 ;a báziscím felső wordjének felső bájtja

    ;;3. descriptor (code segment 1MB 0-nál kezdődik)
    CODE32_SEL equ $-GDT_addr
    dw 0FFFFh ;a szegmens hosszának alsó wordja (határ)
    dw 0 ;a báziscím alsó wordje
    db 0 ;a báziscím felső wordjének alsó bájtja
    db 10011010b ;P=1, DPL=00, S=1, C/D=1, C/E=0, R/W=1, A=0
    db 01001111b ;G=0, D/B=1, AVL=0, reserved=0, határ=1111
    db 0 ;a báziscím felső wordjének felső bájtja

    ;;4. descriptor (data segment 1MB 0-nál kezdődik)
    DATA32_SEL equ $-GDT_addr
    dw 0FFFFh ;a szegmens hosszának alsó wordja (határ)
    dw 0 ;a báziscím alsó wordje
    db 0 ;a báziscím felső wordjének alsó bájtja
    db 10010010b ;P=1, DPL=00, S=1, C/D=0, C/E=0, R/W=1, A=0
    db 01001111b ;G=0, D/B=1, AVL=0, reserved=0, határ=1111
    db 0 ;a báziscím felső wordjének felső bájtja

    ;;5. deszkriptor (stack segment 8Kb 200000h-nál kezdődik)
    STACK_SEL equ $-GDT_addr
    dw 02000h ;a szegmens hosszának alsó wordja (határ)
    dw 0 ;a báziscím alsó wordje
    db 20h ;a báziscím felső wordjének alsó bájtja
    db 10010010b ;P=1, DPL=00, S=1, C/D=0, C/E=0, R/W=1, A=0
    db 01000000b ;G=0, D/B=1, AVL=0, reserved=0, határ=0000
    db 0 ;a báziscím felső wordjének felső bájtja

    ;;6. deszkriptor (screen segment 16Kb 0B8000h-nál kezdődik)
    SCREEN_SEL equ $-GDT_addr
    dw 04000h ;a szegmens hosszának alsó wordja (határ)
    dw 08000h ;a báziscím alsó wordje
    db 0Bh ;a báziscím felső wordjének alsó bájtja
    db 10010010b ;P=1, DPL=00, S=1, C/D=0, C/E=0, R/W=1, A=0
    db 01000000b ;G=0, D/B=1, AVL=0, reserved=0, határ=0000
    db 0 ;a báziscím felső wordjének felső bájtja
    GDT_end:

    GDT_ptr:
    dw GDT_end-GDT_addr ;GDT mérete
    dd GDT_addr ;GDT címe

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    A segmenseim határai csak 1MB, mert úgysem kell egyelőre több.
    Egyébként én most kezdetnek egy olyan progit írok, amely dos alatt átkapcsol védett módba majd vissza. Amíg ez nem megy, addig nem megyek tovább.
    Előre is köszi a válaszokat. :U

    ''A szíved szabad! Légy bátor és kövesd!''

Aktív témák