Проблема с переводом процессора в ProtectedMode

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

  1. White_Noise

    White_Noise New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2008
    Сообщения:
    3
    Здравствуйте ) у меня такая проблема- при выполнении кода с листинга скомпилированного nasm`ом при переводе процессора в защищенный режим после дальнего прыжка на первую инструкцию защищенного режима(точку входа) компьютер перезагружается, насколько я понял процессор получает сигнал ресет из-за ...некоректного физического адресса, формируемого при этом ...либо это что-то другое.Уже до паранои дошло)не могу понять в чем дело, посмотрите пожалуйста исходник, укажите в чем ошибка.Кстати какими еще способами переводят процессор в защищенный режим, помимо загрузки селектора far jmp(call и другими передачи управления) ?в рассылке broken sword`a сказано про LCS.

    Код (Text):
    1. org 100h
    2. section .text
    3. start:
    4. ;..........все прерывания запрещены.......
    5.  ;...A20
    6. in al, 92h
    7. or al, 2
    8. out 92h, al
    9.  
    10. ;..запрет всех прерываний
    11. cli
    12. in al, 70h
    13. or al, 80h
    14. out 70h, al  ; запрет NMI
    15.  
    16. ;.....Загрузка таблицы глобальной в GDTR
    17.  
    18. mov word [GDTR], 0fh     ;размер таблицы -1
    19. xor eax, eax
    20. mov ax, cs
    21. shl eax, 4
    22. add ax, null_desc      
    23. mov dword [GDTR+2], eax
    24. lgdt [GDTR]
    25.  
    26. ;......смещение прыжка
    27. xor eax, eax
    28. mov ax, cs
    29. shl eax, 4
    30. add ax, EntryPoint
    31. mov dword [offset_jmp], eax
    32.  
    33. ;........Вкл
    34. mov eax, cr0
    35. or ax, 01b
    36. mov cr0, eax
    37.  
    38. ;..загрузка cs
    39.  
    40. db 066h    ;Насколько я понимаю в 16 битном варианте этой команды(без префикса), передача сработает точно также.
    41. db 0EAh    
    42. offset_jmp dd 0h  
    43. dw 01000b        
    44.  
    45.  
    46. EntryPoint:              
    47. hlt
    48. section .data
    49.  
    50. null_desc db 00000000000000000h
    51.  
    52. ;............lim....lim...bas...bas..bas....pDPstcwa....gr00LIM....bas
    53. code_desc db 0ffh, 0ffh, 000h, 000h, 000h, 010011010b, 011001111b, 000h
    54.  
    55. GDTR dw 0              ;размер
    56. dd 0                    ;смещение
    nasm -f bin c:\nasm\k.asm -o c:\nasm\k.com ;параметры компилятору
    запускал под досом.
     
  2. Barbos

    Barbos Slavon

    Публикаций:
    0
    Регистрация:
    13 ноя 2007
    Сообщения:
    280
    Адрес:
    Kharkov
    можно с помощью iretd.

    код накорню не верный, чуть позже приведу кусок своего и гляну подробней твой.
     
  3. Barbos

    Barbos Slavon

    Публикаций:
    0
    Регистрация:
    13 ноя 2007
    Сообщения:
    280
    Адрес:
    Kharkov
    на самом деле здесь будет объявлен 1 байт, вместо нужных 8-ми. Надо примерно так
    Код (Text):
    1. null_desc db 0,0,0,0,0,0,0,0
    Кажется здесь будет в АХ загружено слово, распологаемое по адресу null_desc, а не смещение null_desc
    Код (Text):
    1. add ax, offset null_desc
    аналогично.
    Больше ошибок вроде в глаза не бросается.
    То, что код не верный накорню - немного погорячился. Я делал по аналогичному алгоритму. Возьми bochs, он имеет встроенный дебагер. Лучшего инструмента для отладки подоных вещей я не знаю.
    На счет
    перед этим должен быть настроен соответствующим образом стек. У тебя пока это хозяство отсутствует.
     
  4. White_Noise

    White_Noise New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2008
    Сообщения:
    3
    Да уж ...ошибочка) спасибо за внимательность.насчет того что нужно писать offset для для получения значения смещения- это не обязатьльно в насм, только если указать соответствующую директиву.еще раз спасибо) код конечно заработал, тока новая проблема возникла, но это уж я сам.