Здраствуйте. Пишу бутсектор, разбираю переход в реальный режим... Code (Text): [org 0x7c00] start: cli mov ax,cs mov ds,ax mov ss,ax mov es,ax mov sp,start mov bp,sp lgdt [gdt_reg] in al,92h or al,2 out 92h,al mov eax,cr0 or al,1 mov cr0,eax jmp 8:protected [BITS 32] protected: mov ax,10h mov ds,ax mov ss,ax mov esi,msg_hello call kputs hlt jmp short $ kputs: pusha .loop lodsb test al,al jz .quit mov ecx,[cursor] mov [VIDEO_RAM+ecx*2],al inc dword [cursor] jmp short .loop .quit: popa ret gdt: dw 0,0,0,0 db 0ffh,0ffh,0,0,0,10011010b,0cfh,0 db 0ffh,0ffh,0,0,0,10010010b,0cfh,0 gdt_reg: dw 8192 dd gdt cursor: msg_hello: db "Hello from the world of 32-bit Protected Mode",10,13,0 VIDEO_RAM: dw 0b8000h times 510-($-$$) db 0 db 0aah,55 Собираю код NASM'ом в boot.bin Эмулятор - VMware Теперь проблема: почему не выводится текст msg_hello?
с NASM'ом никогда не работал, но тем не менее будем надеяться что синтаксис у тебя правильный. dd gdt - должно равняться абсолютному адресу таблицы, лучше поставь 0 она все равно у тебя в нулевом сегменте находится. В дескрипторах поставь равным нулю бит D - бит разрядности операндов и адресов. (Это там где 0cfh стоит поставь 8fh) Code (Text): mov ecx,[cursor] mov [VIDEO_RAM+ecx*2],al inc dword [cursor] не совсем понятен этот кусок. получается что [cursor] указывает на строку? И еще можно запретить прерывания NMI перед переходом в защищенный режим: Code (Text): mov al,80h out 70h,al
Вот мой офигенско-норкоманский исходник для FASM бутсектора с подробными комментариями, который инициализирует протектед моде, ставит IDT, разрешает прерывания и обрабатывает IRQ0 и IRQ1. Буковки, введенные на клаве, показываются на экране (регистр символов не различается, функциональные клавиши не обрабатываются). Остановка - по <Esc>. Обработчик таймера (IRQ0) меняет символ в левом верхнем углу экрана. ЗЫ. поскольку в 512 байт впихнуть не удалось, добавил код для чтения дополнительных секторов с диска. Сорс: http://gr8.cih.ms/uploads/ring0.asm Скриншотенг:
классный экземлярчек. кто там оси пишет, можете взять за основу ) перехватил инт3 аналогичным способом через IDT в виндовом драйвере
cursor: dd 0 %define VIDEO_RAM 0xb8000 а как ты в бутсектор пишешь? P.S. Я юзаю rawwrite.exe, под VMWare 5ххх все работает нормально.
можно указать собранный .bin сразу как образ дискеты. пофиг, что он меньше 1.44Мб, будет работать. Я так делал со своим лоадером (см. пост №3)
Code (Text): cursor: msg_hello: db "Hello from the world of 32-bit Protected Mode",10,13,0 Видимо, имелось ввиду Code (Text): cursor: dd 0x0 msg_hello: db "Hello from the world of 32-bit Protected Mode",10,13,0 ? Да, совсем забыл: необходимо установить атрибуты литеры в видеопамяти. Т.е. добавить: Code (Text): kputs: ... mov ecx,[cursor] mov ah, 0x7 ;или 0xF для ярко-белого. mov [VIDEO_RAM+ecx*2],ax ... ret
Code (Text): по дефолту стоит все ок, если не забыть резетнуть экран через прерывание BIOS В коде этого нет, так что лучше добавить установку атрибутов. А код прерывания сам проставляет всем ячейкам 0x7?
Mika0x65 ну раз он очищает экран, я предполагаю, что атрибуты выставляются. по крайней мере, смотри выше мой код - работает нормально.
Great Раз уж речь зашла, не подскажешь ссылку, где можно почитать о текстовой видеопамяти? Особо интересуют режимы (как я понял, сщуествует не только 80х25), затем, насколько я знаю, в разных режимах старший бит атрибута может отвечать либо за яркость фона либо за мигание литеры... Но где об этом можно узнать подробнее?
да, есть еще 80x50, 40х25 и, кажется, 40х50. вроде бы да. Насчет режимов - скачай Interrupt List Ральфа Брауна, офигенная вещь. Конечно, если дружишь с английским. Там все прерывания, в том числе и INT 10 для видео. Там же есть и Memory List и Port List, в первом из них кажется есть немного про видеобуфер, который по линейному адресу B8000 лежит.
Вопрос может быть не в тему. Но все равно спрошу. Как дизассеблировать в IDA загрузчики. Перед анализом Ида спрашивает какой режим выбрать 16 или 32. Выбирю 32 ничего толкового нет, такая же ситуация с 16. Каким образом заставить ИДА совместить. ну или хотя бы правильно дизассеблировать. Мне очень интересно какой код загрузчике создали разные компиляторы (fasm, nasm под masm под masm не поробовал)
St Надо просто распихать код разной разрядности по разным сегментам и соотв. сделать их use16 и use32. Edit -> Segments -> Edit Segment для урезания текущего сегмента и Edit -> Segments -> Create Segment для создания нового
ntldr 16-ти разрядный, но в его хвост вшит 32-х битный PE файл. У меня он по смещению 4d00h (просто ищи символы "PE"). Просто делаешь небольшую программку и вырезаешь его.
Действительно у меня по смещению 4d00h сигнатура MZ идет и какойто хитрый PE заголовок. Еще один момент IDA текстовые данные типа "ntldr испорчен не возможно загрузить страниццу" дизассеблировала, выдала код