Вот что у меня пока получилось. Но работает не всё После(находится в файле loader.asm): Код (Text): in al, 92h or al, 2 out 92h, al Сообщение почему-то не выводится Код (Text): mov si, mess_3 call p_loader_debug_mess Мне кажется что виновато не 92h, а вывод сообщения, но из-за этого я не могу проследить как выполняется моя ОС Пожалуйста, укажите и исправьте ошибки (если ошибка в выводе текста то скажите как его выводить правельнее). *Загрузчик загружает второй загрузчик(в расчёте на более долгую загрузку) *Переход в защищённый режим *Работа в защищённом режиме *Каждый шаг программы отображается на экране *Код находится в самой начальной стадии развития main.asm Код (Text): include 'boot.asm' times (512-2-($-7C00h)) db 0 db 055h,0AAh include 'loader.asm' times (512-($-7E00h)) db 0 include 'kernel.asm' boot.asm Код (Text): org 7c00h use16 mov ax, cs mov ds, ax mov es, ax mov ss, ax mov ax, 7fffh mov sp, ax mov si, mess_boot call p_boot_debug_mess mov dl, 0 ;drive number (A = 0) mov dh, 0 ;head mov ch, 0 ;cylinder mov cl, 2 ;sector mov ax, 0000h ;segment mov es, ax ; mov al, 2 ;sector count mov bx, 7E00h ;offset mov ah, 2 int 13h mov si, mess_boot1 call p_boot_debug_mess jmp 7E00h mess_boot db "[00:boot] ", 0 mess_boot1 db "[01:load loader] ", 0 p_boot_debug_mess: xor ax,ax xor bx,bx @@: lodsb test al, al jz @F mov ah, 0Eh int 10h jmp short @B @@: xor ah,ah int 16h xor ax,ax xor bx,bx xor cx,cx xor dx,dx xor si,si ret loader.asm Код (Text): org 7E00h use16 jmp loader_start mess_1 db "[02:start loader] ", 0 mess_2 db "[03:out 20h;out 21h] ", 0 mess_3 db "[04:in\out 92h] ", 0 mess_4 db "[05:lgdt] ", 0 mess_5 db "[06:push 2;pop] ", 0 mess_7 db "[07:cr0] [08:_protected] ", 0 mess_8 db "[09:es,ds,ss = 1000b] ", 0 mess_9 db "[0A:$=0] ", 0 mess_10 db "[0B:load kernel] ", 0 p_loader_debug_mess: xor ax,ax xor bx,bx @@: lodsb test al, al jz @F mov ah, 0Eh int 10h jmp short @B @@: xor ah,ah int 16h xor ax,ax xor bx,bx xor cx,cx xor dx,dx xor si,si ret use32 p_loader32_debug_mess: xor eax,eax xor ebx,ebx @@: lodsb test al, al jz @F mov ah, 0Eh int 10h jmp short @B @@: xor ah,ah int 16h xor eax,eax xor ebx,ebx xor ecx,ecx xor edx,edx xor esi,esi ret use16 loader_start: mov si, mess_1 call p_loader_debug_mess use16 mov al,00010001b out 20h,al mov al,20h out 21h,al mov al,00000100b out 21h,al mov al,00000001b out 21h,al mov si, mess_2 call p_loader_debug_mess in al, 92h ;-------------------------------------------------------------------------------------- or al, 2 ;-------------------------------------------?????---------------------------------------- out 92h, al ;------------------------------------------------------------------------------------- mov si, mess_3 call p_loader_debug_mess lgdt [gd_reg] mov si, mess_4 call p_loader_debug_mess push 2 popf mov si, mess_5 call p_loader_debug_mess mov eax, cr0 or al, 1 mov cr0, eax jmp 16:_protected use32 _protected: mov esi, mess_7 call p_loader32_debug_mess mov ax, 1000b mov es, ax mov ds, ax mov ss, ax mov esi, mess_8 call p_loader32_debug_mess mov [$], byte 0 mov esi, mess_9 call p_loader32_debug_mess mov dl, 0 ;drive number (A = 0) mov dh, 0 ;head mov ch, 0 ;cylinder mov cl, 2 ;sector mov ax, 0000h ;segment mov es, ax ; mov al, 4 ;sector count mov bx, 1000h ;offset mov ah, 2 int 13h mov esi, mess_10 call p_loader32_debug_mess xor eax, eax xor ecx, ecx jmp 1000h use16 gd_table: dw 0xFFFF,0x0000,0x9200,0x00CF dw 0xFFFF,0x0000,0x9A00,0x00CF db 0x67, 0,0,0,0 ,10001001b, 01000000b, 0 gd_reg: dw 255 dd gd_table-8 use32 jmp 1000h kernel.asm Код (Text): org 1000h use32 jmp kernel_start mess_loading db "[0C:start kernel] ", 0 kernel_start: mov esi, mess_loading call p_kernel_debug_mess cli hlt jmp short $ p_kernel_debug_mess: xor eax,eax xor ebx,ebx @@: lodsb test al, al jz @F mov ah, 0Eh int 10h jmp short @B @@: xor ah,ah int 16h xor eax,eax xor ebx,ebx xor ecx,ecx xor edx,edx xor esi,esi ret
Предположу, что это из-за того, что при использовании порта 92h (порт из пространства PS/2) для открытия линии A20 иногда возникают проблемы с видео. Подробности способов включения линии A20 уже обсуждались http://www.wasm.ru/forum/viewtopic.php?id=9801 Классический способ включения A20, через контроллер клавиатуры I8042 приведен далее Код (Text): call delay mov al,0D1h out 64h,al ;команда управление линией A20 call delay mov al,0DFh ;разрешаем работу линии out 60h,al call delay . . . delay proc push cx xor cx,cx dec cx m: in al,64h test al,10b ;буфер контроллера клавы свободен? loopnz m pop cx ret delay endp Попробуй его, не заработает будем дальше смотреть
А можно-ли вывести символ на экран просто записав его в оперативную память. Например: Код (Text): mov word [0B800h], 1F01h Если да, то как узнать адрес куда надо записывать. Если нет, то как вывести символ на экран, не использовав биос. *Добавлено: Как это делать в реальном и в защищённом режиме?
Для отладки таких вещей очень помогает Bochs (http://bochs.sf.net , который раз я этй ссылку привожу ). В видеопамять можно писать напрямую по адресу 0xB8000. В 16битном режиме это делается так: push es mov ax, 0xB800 mov es, ax mov al, 'A' mov ah, 0x7 mov [es:0x0], ax pop es этот код выводит символ 'A' белого цвета на черном фоне. В защищенном режиме то же самое, разве что адресовать 0xB8000 будет немного проще: mov al, 'A' mov ah, 0x7 mov [0xB8000], ax