Бесконечный цикл в PM

Тема в разделе "WASM.ASSEMBLER", создана пользователем zStorm, 23 мар 2006.

  1. zStorm

    zStorm New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2005
    Сообщения:
    44
    Адрес:
    Ukraine
    Доброго времени суток to all

    Нарисовалась интересная проблема в защищенном режиме - не работает бесконечный цикл.

    Идея в том, чтобы после перехода в защищенный режим подождать пока на клаве не будет нажата клавиша tab, например.

    Используютьса порты ввода-вывода. Вот код:
    Код (Text):
    1.  
    2. ;-----------------------------------------
    3.     in      al,92h
    4.         or      al,02h
    5.         out     92h,al
    6.  
    7.         cli
    8.         in      al,70h
    9.         or      al,80h
    10.         out     70h,al                 ;Jump to PM
    11.  
    12.         mov     eax,cr0
    13.         or      al,1
    14.         mov     cr0,eax
    15. ;-----------------------------------------
    16. ;Мы уже в защищенном. Теперь ждем кнопку:
    17.  
    18.     wait4Key:
    19.           in      al,60h
    20.           cmp     al,0fh ;Скан-код tab
    21.         jne     wait4Key
    22.  




    В vmware етот кусок вылетает с сообщением о переполнении стека ("Virtual machine kernel stack fault"). Если закомментировать jne wait4Key, все работает нормально, правда кнопку никто ждать не собираетьса :)

    В реальном режиме такое ожидание работает, а в PM-нет 8-/ .
     
  2. sergh

    sergh New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    128
    Адрес:
    rsdn
    Приведи код полностью. Бесконечный цикл в PM прекрасно работает, лично проверял.
     
  3. zStorm

    zStorm New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2005
    Сообщения:
    44
    Адрес:
    Ukraine
    ОК, вот весь код:
    Код (Text):
    1.  
    2. ;Ето загрузочный сектор. Загружает второй сектор, который
    3. ;переводит проц в PM
    4.  
    5. format binary
    6. use16
    7.  
    8. org 7c00h
    9.  
    10. Titan_Entry:
    11.     jmp     start
    12.  
    13. ;---------------------  MS-DOS table ----------------
    14. ;               Всякая инфа о файловой системе
    15. ;----------------end of MS-DOS table ----------------
    16.  
    17.   start:
    18.  
    19.     mov   ah,00h
    20.     mov   al,03h
    21.     int   10h     ;Setting display mode 80x25 with 16 colors
    22.  
    23. ;----------------------------------------------------
    24. ;Loading second sector module. It will jump to PM
    25. ;----------------------------------------------------
    26.     mov   ah,02h
    27.     mov   al,01h
    28.     mov   ch,00h
    29.     mov   cl,02h
    30.     xor   dx,dx
    31.     mov   bx,7e00h
    32.     int   13h
    33.  
    34. ;----------------------------------------------------
    35. ;Jumping there
    36. ;----------------------------------------------------
    37.     call  7e00h
    38.  
    39. ;----------------------------------------------------
    40. ;Halting processor
    41. ;----------------------------------------------------
    42.  
    43.     cpuid ;Ну, типа ждем пока все команды исполнятьса
    44.  
    45.     cli
    46.     hlt
    47.  
    48. ;----------------------------------------------------
    49. ;Some data...
    50. ;----------------------------------------------------
    51. NitroText db 'Nitro loader. Welcome!',00h
    52.  
    53. ;Далее идет тот самый второй сектор, переводящий проц в РМ
    54. ;*********************************************************
    55. format binary
    56. use16
    57.  
    58. org 7e00h
    59. start:
    60.         push    0b800h
    61.         pop     ds     ;Чтоб к видеопамяти можно было достучатьса через ds
    62.        
    63. ;----------------
    64.         in      al,92h
    65.         or      al,02h     ;Включаем А20
    66.         out     92h,al
    67.  
    68.         cli
    69.         in      al,70h     ;Вырубаем немаскируемые прерывания
    70.         or      al,80h
    71.         out     70h,al
    72.  
    73.  
    74.         mov     eax,cr0
    75.         or      al,1
    76.         mov     cr0,eax      ;Переводим проц в PM
    77.  
    78.         in      al,70h
    79.         and     al,07fh      ;Разрешаем прерывания
    80.         out     70h,al
    81.  
    82.         sti
    83. ;----------------
    84.  
    85.         wait4Key:
    86.         in      al,60h
    87.         cmp     al,0fh ;Скан-код tab
    88.         jne     wait4Key
    89.  
    90.         ret
    91.  




    Вот и все пироги.
     
  4. sergh

    sergh New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    128
    Адрес:
    rsdn
    А IDT инициализировать, обработчики прерываний писать? Это где-то есть, просто пропущено, или этого нет вообще?
     
  5. sergh

    sergh New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    128
    Адрес:
    rsdn
    Кстати, а если просто не разрешать прерывания? Не вижу в этом смысла, а падает, имхо, из-за этого.
     
  6. zStorm

    zStorm New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2005
    Сообщения:
    44
    Адрес:
    Ukraine
    Если закомментировать cli, то все работает нормально, без сорванного стека. Наверное когда он заходит в бесконечній цикл, идут разніе прерівания ну от таймера и т.д. А так как я ни одного прерівания не настроил, то стек и слетает. Вроде так.
     
  7. Folk Acid

    Folk Acid New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2005
    Сообщения:
    432
    Адрес:
    Ukraine
    Код (Text):
    1.  
    2. or      al,1
    3. mov     cr0,eax      ;Переводим проц в PM
    4.  
    5. in      al,70h
    6.  


    Ты этот код сам придумал? Тогда посмотри в книжке как делается переход в PM (где-то jmp потерялся)
     
  8. sergh

    sergh New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    128
    Адрес:
    rsdn
    zStorm

    Да, я тоже так предположил



    Folk Acid

    Код правильный. Хуже того, он даже работает. jmp нужен для перезагрузки CS нормальным селектором сегмента кода, тут это пока не требуется. Вот когда нужно будет прерывания обрабатывать, тогда да.