Защищенный режим: база и лимиты

Тема в разделе "WASM.BEGINNERS", создана пользователем lorin, 25 янв 2008.

  1. lorin

    lorin New Member

    Публикаций:
    0
    Регистрация:
    19 дек 2007
    Сообщения:
    2
    Здраствуйте! Помогите пожалуйста разобраться со следующей не работающей программой:

    Код (Text):
    1. .386p
    2.  
    3. descr       struc
    4. limit       dw      0
    5. base_l      dw      0
    6. base_m      db      0
    7. attr1       db      0
    8. attr2       db      0
    9. base_h      db      0
    10. descr       ends
    11.  
    12. rm_code segment use16
    13.         assume  cs: rm_code, ds: rm_code
    14. start:
    15.         push        cs
    16.         pop     ds
    17.         ; Открываем линию A20.
    18.         in      al, 92h
    19.         or      al, 2
    20.         out     92h, al
    21.         ; Вычисляем точку входа в защищеный режим.
    22.         xor     eax, eax
    23.         xor     edx, edx
    24.         mov     ax, pm_code
    25.         shl     eax, 4
    26.         mov     edx, eax                             ;база сегмента кода
    27.         add     eax, offset pm_entry
    28.         mov     dword ptr pm_offst, eax
    29.         ; Находим и заносим в GDT базу сегмента кода для защищенного режима.
    30.         mov     bx, offset gdt_code
    31.         mov     [bx].base_l, dx
    32.         rol     edx, 16
    33.         mov     [bx].base_m, dl
    34.         mov     [bx].base_h, dh
    35.         ; Загружаем GDTR.
    36.         xor     eax, eax
    37.         mov     ax, cs
    38.         shl     eax, 4
    39.         add     ax, offset gdt_null
    40.         mov     dword ptr pdescr+2, eax
    41.         mov     word ptr pdescr, gdt_size-1
    42.         lgdt        pdescr
    43.         ; Запретим все прерывания.
    44.         cli
    45.         in      al, 70h
    46.         or      al, 80h
    47.         out     70h, al
    48.         ; Переключаемся в защищенный режим.
    49.         mov     eax, cr0
    50.         or      al, 1
    51.         mov     cr0, eax
    52.         ; Прыгаем в сегмент защищенного режима.
    53.         db      66h
    54.         db      0EAh
    55. pm_offst    dd      ?
    56.         dw      8
    57.        
    58. ; Таблица глобальных дескрипторов.
    59. gdt_null    descr   <0, 0, 0, 0, 0, 0>
    60. gdt_code    descr   <pmc_size-1, 0, 0, 10011010b, 01000000b, 0>
    61. gdt_size = $ - gdt_null
    62. pdescr  df      0
    63. rm_code ends
    64.  
    65. pm_code segment use32
    66.         assume  cs: pm_code
    67. pm_entry:
    68.         jmp     $
    69. pmc_size = $ - pm_entry
    70. pm_code ends
    71.  
    72. stk     segment stack
    73. db      256     dup(?)
    74. stk     ends
    75.  
    76. end     start
    Если занести в GDT базу для сегмента кода 0 и лимит в 4Гб, то всё работает
    прекрасно. Значит я не правильно вычисляю базу сегмента либо возникают каке-то
    проблемы с его границей. Подскажите в чем ошибка.
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Я думаю, надо поменять местами эти строчки:

    Код (Text):
    1. mov     edx, eax                             ;база сегмента кода
    2. add     eax, offset pm_entry
    Тогда в edx будет физический адрес кода 'jmp $'.
     
  3. lorin

    lorin New Member

    Публикаций:
    0
    Регистрация:
    19 дек 2007
    Сообщения:
    2
    Неа, так тоже не работает. В edx я заношу базу сегмента (для заполнения GDT в будущем).
    Вообще я думаю, что add eax, offset pm_entry можно вообще убрать, т.к pm_entry расположена в самом начале сегмента кода, т.е получается add eax, 0. Обязательно пните меня, если я не прав (но только не очень больно:), т.к. хочется разобраться с PM получше, а на асм я программирую недавно.
     
  4. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Метка pm_entry относительно сегмента pm_code имеет адрес pm_entry (он же 0), а не pm_code<<4 + pm_entry. Так что вместо
    Код (Text):
    1.         add     eax, offset pm_entry
    2.         mov     dword ptr pm_offst, eax
    нужно писать
    Код (Text):
    1.         mov     dword ptr pm_offst, offset pm_entry