Здравствуйте, подскажите пожалуйста не могу понять как перейти на код в защищенный режим, использую Fasm 1.71, UltraIso, Oracle VM VirtualBox, вот собственно код Code (ASM): format binary use16 org 7c00h start: mov ax, 3 int 10h mov ax, 0b800h mov es, ax mov ax, cs mov ds, ax ;вывод сообщения из реального режима mov si, MessageRM xor di, di mov cx, 15 rep movsb ; адрес и размер GDT таблицы xor eax, eax mov ax, Table_GDT shl eax, 4 mov dword[GDTR + 2], eax lgdt fword ptr GDTR ; Запретить маскируемые прерывания cli ; Запретить немаскируемые прерывания (NMI) in al, 70h or al, 80h out 70h, al ;Открыть линию A20 in al, 92h or al, 2 out 92h, al ; Переключиться в защищённый режим mov eax, cr0 or al, 1 mov cr0, eax ;========?????????=========== ; jmp addres ; когда ставлю просто jmp $ все норм а так виртуал машина ругается ;=================== ;PM Защищенный режим use32 label addres xor eax, eax mov ax, (8 * 2) ;data selector mov ds, ax mov gs, ax mov fs, ax mov ax, (8 * 3) ; stak selector mov ss, ax mov ax, (8 * 4) ; video selector mov es, ax ;;вывод сообщения lea esi, [MessagePM] mov edi, 160 mov ecx, 15 rep movsb jmp $ hlt ;============DATA========== Table_GDT: gdt_begin = $ db 8 dup(0) ;null descriptor desc_code db 0FFh,0FFh,00h,00h,00h,10011010b,11001111b,00h ;code 00000:ffff desc_data db 0FFh,0FFh,00h,00h,00h,10010010b,11001111b,00h ;date 00000:ffff desc_stac db 0FFh,0FFh,00h,80h,0Bh,10010010b,01000000b,00h ;stak b8000:ffff desc_video db 0FFh,0FFh,00h,80h,0Bh,10010010b,01000000b,00h ;video b8000:ffff gdt_size = ($ - gdt_begin) GDTR dw gdt_size-1 ; 16-битный лимит GDT dd ? ; 32-битный линейный адрес GDT MessagePM db "222222222222222",0 MessageRM db "111111111111111",0 подскажите что не так?
Открой библию свидетелей интела, том 3, глава 9.9 'Mode switching', там пошагово описано что нужно сделать: И речь только о far jmp и far call, так что наверное это важно. У тебя jmp самый заурядный и очень недалекий применен.
f13nd, а вы к этой секте никакого отношения не имеете? Я даже знаю имя патриарха этой секты. Как и слово Интел - оно тоже начинается на И. Или я, как и в большинстве случаев, - ошибаюсь? А если серьезно, хотел спросить попутно - как FASM заставить выдавать на выход при компиляции только машинный код? И есть ли в "природе" дизассемблеры, которые выдают на выход ассемблер близкий к FASM? В тех же ИДА, Радаре, HIEV и в известных отладчиках - есть дизассемблеры, но это все немного не то.
Спасибо что ответили и за ссылку , методом тыка нашел решение, написал следующий код db 66h db 0eah dd $ + 2 dw 08h и в строке 19 была ошибка не нужно смешать биты --- Сообщение объединено, Mar 17, 2019 --- попробуй этот сайт https://defuse.ca/online-x86-assembler.htm#disassembly может найдешь что ищешь
Без директивы 'format' фасм собирает бинарники без ничто. --- Сообщение объединено, Mar 17, 2019 --- Я для риппинга скриптом прохожусь в иде по листингу, меняет синтаксис (правда топорненько), других причин приводить дизасм в фасмосинтаксис не вижу.
Да у меня причина может со стороны выглядит и по-дилетантски, в связи с отсутствием каких-либо знаний. Но все до банального просто. В той же ИДЕ иногда какая-нибудь команда заинтересует и думаешь: Интересно, а как ее в FASM-е реализовать?
Почти так же, выбросив директиву 'ptr', внеся имя сегмента и смещение (с плюсом) в скобки. Адрес в масме всегда 'offset %', для фасма это '%', просто адрес '%' в масме для фасма '[%]' (вызовов и переходов это не касается). Фасм в этом плане логичней, но если не писать на этом масме, он вполне удобоварим.