Загрузка селектора в защищенном режиме

Тема в разделе "WASM.UNIX", создана пользователем CuRT, 13 мар 2006.

Статус темы:
Закрыта.
  1. CuRT

    CuRT New Member

    Публикаций:
    0
    Регистрация:
    9 мар 2006
    Сообщения:
    1
    При написание програмки демонстрирующей работу загрузчика, столкнулся с проблемой: прога при работе в защищенном режиме не загружает селектор сегмента кода (я пытался сделать это jmpl)

    Если кто знает как это делеть правильно,

    напишите пожалуйста





    вот исходник:



    BOOT_SEG= 0x7c0



    .code16

    .text

    .globl _start



    _start:

    jmpl $BOOT_SEG,$boot # тут все ОК



    boot:

    cli



    movl %cs,%eax

    movl %eax,%ds

    movl %eax,%es

    movl $_start,%esp

    movl %esp,%ebp



    sti



    movl $msgr,%esi

    movb $0xe,%ah





    rprint:

    lodsb

    int $0x10

    test %al,%al

    jnz rprint







    #defined base-gdt

    cli



    xorl %eax,%eax

    movl $_protect,%eax

    shll $4,%eax

    addl $gdt,%eax

    movl %eax,(gdtr+2)



    #load gdtr

    lgdt gdtr



    #20A enable



    inb $0x92,%al

    orb $2,%al

    outb %al,$0x92



    #dis unmask interrupt

    inb $0x70,%al

    orb $0b10000000,%al

    outb %al,$0x70

    #protect mode ON

    movl %cr0,%eax

    orb $1,%al

    movl %eax,%cr0



    .code32

    /*

    а вот после

    прыжка

    вылетает

    */

    # jmpl $8,$_protect #load cs-selector





    .byte 0x66

    .byte 0xEA

    _offset: .long (_protect)

    .word 0b00001000



    # movl $_protect,(_offset)

    _protect:



    movl $0b00010000,%eax

    movl %eax,%ds

    movl %eax,%ss





    movl $msg,%esi

    xorl %edi,%edi



    movl $0b00011000,%eax

    movl %eax,%es



    movw $msg_l,%cx



    rep

    movsb





    /*

    movl $msg,%esi

    movl $0xb800,%ebx

    xorl %ecx,%ecx



    pprint: #protect print

    lodsb

    movb %al,(%ebx,%ecx)

    incl %ecx

    test %al,%al

    jnz pprint

    */





    quit:

    hlt

    jmp quit









    .align 16

    gdt:

    #null-descr

    .word 0,0,0,0

    #code-descr

    .byte 0xff,0xff,0x00,0x00,0x00,0b10011010,0b11001111,0x00

    #data-descr

    .byte 0xff,0xff,0x00,0x00,0x00,0b10010010,0b11001111,0x00

    #video-descr

    .byte 0xff,0xff,0x00,0x80,0x0b,0b10010010,0b01000000,0x00





    gdt_end:

    .align 4

    .word 0





    gdtr:

    .word gdt_end-gdt-1 #limit

    .word 0,0 #base

    msgr: .asciz "Real mode ...\n"

    msg: .string "32-bits .... enable protect mode ... \n"

    msg_l=.-msg

    .byte 0

    .org 510

    .word 0xAA55



    P.S зараннее извиняюсь за свою безграмотность
     
Статус темы:
Закрыта.