переход в защищенный режим

Тема в разделе "FASM", создана пользователем Aleks715, 17 мар 2019.

Метки:
  1. Aleks715

    Aleks715 New Member

    Публикаций:
    1
    Регистрация:
    5 мар 2019
    Сообщения:
    5
    Здравствуйте, подскажите пожалуйста не могу понять как перейти на код в защищенный режим, использую Fasm 1.71, UltraIso, Oracle VM VirtualBox, вот собственно код
    Код (ASM):
    1. format binary
    2. use16
    3. org 7c00h
    4. start:
    5. mov ax, 3
    6. int 10h
    7. mov ax, 0b800h
    8. mov es, ax
    9. mov ax, cs
    10. mov ds, ax
    11. ;вывод сообщения из реального режима
    12. mov si, MessageRM
    13. xor di, di
    14. mov cx, 15
    15. rep movsb
    16. ; адрес и размер GDT таблицы
    17. xor eax, eax
    18. mov ax, Table_GDT
    19. shl eax, 4
    20. mov dword[GDTR + 2], eax
    21. lgdt fword ptr GDTR
    22. ; Запретить маскируемые прерывания
    23. cli
    24. ; Запретить немаскируемые прерывания (NMI)
    25. in   al, 70h
    26. or   al, 80h
    27. out 70h, al
    28. ;Открыть линию A20
    29. in   al,  92h
    30. or   al,  2
    31. out 92h,  al
    32. ; Переключиться в защищённый режим
    33. mov eax, cr0
    34. or  al, 1
    35. mov cr0, eax
    36. ;========?????????===========
    37. ; jmp addres ; когда ставлю просто jmp $ все норм а так виртуал машина ругается
    38. ;===================
    39. ;PM Защищенный режим
    40. use32
    41. label addres
    42. xor eax, eax
    43. mov ax, (8 * 2) ;data selector
    44. mov ds, ax
    45. mov gs, ax
    46. mov fs, ax
    47. mov ax, (8 * 3) ; stak selector
    48. mov ss, ax
    49. mov ax, (8 * 4) ; video selector
    50. mov es, ax
    51. ;;вывод сообщения
    52. lea esi, [MessagePM]
    53. mov edi, 160
    54. mov ecx, 15
    55. rep movsb
    56. jmp $
    57. hlt
    58. ;============DATA==========
    59. Table_GDT:
    60. gdt_begin = $
    61. db 8 dup(0) ;null descriptor
    62. desc_code db 0FFh,0FFh,00h,00h,00h,10011010b,11001111b,00h ;code 00000:ffff
    63. desc_data db 0FFh,0FFh,00h,00h,00h,10010010b,11001111b,00h ;date 00000:ffff
    64. desc_stac db 0FFh,0FFh,00h,80h,0Bh,10010010b,01000000b,00h ;stak  b8000:ffff
    65. desc_video db 0FFh,0FFh,00h,80h,0Bh,10010010b,01000000b,00h ;video b8000:ffff
    66. gdt_size = ($ - gdt_begin)
    67. GDTR dw gdt_size-1       ; 16-битный лимит GDT
    68. dd ?                ; 32-битный линейный адрес GDT
    69. MessagePM db "222222222222222",0
    70. MessageRM db "111111111111111",0
    подскажите что не так?
     
    Последнее редактирование модератором: 18 мар 2019
  2. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.953
    Открой библию свидетелей интела, том 3, глава 9.9 'Mode switching', там пошагово описано что нужно сделать:
    И речь только о far jmp и far call, так что наверное это важно. У тебя jmp самый заурядный и очень недалекий применен.
     
    Последнее редактирование: 17 мар 2019
    Aleks715 нравится это.
  3. rasstriga

    rasstriga New Member

    Публикаций:
    0
    Регистрация:
    15 мар 2019
    Сообщения:
    9
    f13nd, а вы к этой секте никакого отношения не имеете? :) Я даже знаю имя патриарха этой секты. Как и слово Интел - оно тоже начинается на И. Или я, как и в большинстве случаев, - ошибаюсь? :)

    А если серьезно, хотел спросить попутно - как FASM заставить выдавать на выход при компиляции только машинный код? И есть ли в "природе" дизассемблеры, которые выдают на выход ассемблер близкий к FASM? В тех же ИДА, Радаре, HIEV и в известных отладчиках - есть дизассемблеры, но это все немного не то.
     
  4. Aleks715

    Aleks715 New Member

    Публикаций:
    1
    Регистрация:
    5 мар 2019
    Сообщения:
    5
    Спасибо что ответили и за ссылку , методом тыка нашел решение, написал следующий код
    db 66h
    db 0eah
    dd $ + 2
    dw 08h
    и в строке 19 была ошибка не нужно смешать биты :mda:
    --- Сообщение объединено, 17 мар 2019 ---
    попробуй этот сайт https://defuse.ca/online-x86-assembler.htm#disassembly может найдешь что ищешь
     
    rasstriga нравится это.
  5. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.953
    Без директивы 'format' фасм собирает бинарники без ничто.
    --- Сообщение объединено, 17 мар 2019 ---
    Я для риппинга скриптом прохожусь в иде по листингу, меняет синтаксис (правда топорненько), других причин приводить дизасм в фасмосинтаксис не вижу.
     
    rasstriga нравится это.
  6. rasstriga

    rasstriga New Member

    Публикаций:
    0
    Регистрация:
    15 мар 2019
    Сообщения:
    9
    Да у меня причина может со стороны выглядит и по-дилетантски, в связи с отсутствием каких-либо знаний. Но все до банального просто. В той же ИДЕ иногда какая-нибудь команда заинтересует и думаешь: Интересно, а как ее в FASM-е реализовать?
     
  7. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.953
    Почти так же, выбросив директиву 'ptr', внеся имя сегмента и смещение (с плюсом) в скобки. Адрес в масме всегда 'offset %', для фасма это '%', просто адрес '%' в масме для фасма '[%]' (вызовов и переходов это не касается). Фасм в этом плане логичней, но если не писать на этом масме, он вполне удобоварим.
     
    rasstriga нравится это.
  8. Коцит

    Коцит Active Member

    Публикаций:
    0
    Регистрация:
    31 янв 2017
    Сообщения:
    130
    format binary
     
    rasstriga нравится это.
  9. rasstriga

    rasstriga New Member

    Публикаций:
    0
    Регистрация:
    15 мар 2019
    Сообщения:
    9
    Спасибо за советы! Компилятор всех рассудит! :)