|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Окт 30, 2004 18:10:28 Помогите плз разобраться с защищенным режимом... Читаю на сайте статьи Broken Sword`а на эту тему и начал писать код. Но что-то не получается :( Вот сама программа (на fasm):
format binary
use16
org 7c00h
;Очистка экрана
mov ax, 3
int 10h
cli
;Открываем линию A20 для 32-х битной адресации
in al, 92h
or al, 2
out 92h, al
;Загружаем GDT
lgdt [GDTR]
;Переключаемся в защищенный режим
mov eax, cr0
or al, 1
mov cr0, eax
jmp far 8:entry_point
GDT:
NULL_descr: times 8 db 0
CODE_descr db 0ffh, 0ffh, 00h, 00h, 00h, 10011010b, 11001111b, 00h
DATA_descr db 0ffh, 0ffh, 00h, 00h, 00h, 10010010b, 11001111b, 00h
VIDEO_descr db 0ffh, 0ffh, 00h, 80h, 0bh, 10010010b, 01000000b, 00h
GDT_size equ $-GDT
GDTR: dw GDT_size-1
dd GDT
;--------------------------------------------------------
entry_point:
use32
xor eax, eax
mov ax, 00010000b
mov ds, ax
mov ss, ax
mov ax, 00011000b
mov es, ax
mov esi, MSG
xor edi, edi
mov ecx, 7
rep movsb
jmp $
MSG db 'Hello!', 0
Так вот, в чем проблема. До команды jmp far 8:entry_point все идет хорошо. Но вот после нее все падает (т.е. vmware говорит какую-то ошибку про kernel и т.п.). Скажите, что я не так делаю? :) |
|
|
Дата: Окт 30, 2004 18:24:10 Не знаю, что такое "vmware", но эта программа расчитана на запуск из реального режима (дос без расширителей), а директива org 7c00h как бы намекает на то, что ее надо разместить в boot-секторе или хотя бы по адресу <any seg>:<7c00>. Видимо, надо еще почитать рядом в этой статье :) |
|
|
Дата: Окт 30, 2004 18:28:19 VMWare - это эмулятор. То что нужно поместить в бут сектор - это понятно :) Я записываю образ на дискету и гружу ее эмулятором. Так что тут вроде все в порядке. Да, понял тут вдруг, что строчка не выведется, т.к. сегмент данных другой =) Это я так, к слову. |
|
|
Дата: Окт 30, 2004 19:38:12 естественно, читай статью еще раз адрес entry_point должен быть уже отнасительно сегмента, в статье должна быть расчётная формула... попробу сделать так .... jmp far 8:0x10000 org 0x10000 entry_point: use32 ... хотя в маловероятно что сработает |
|
|
Дата: Окт 30, 2004 21:05:37 Сам ничего не шарил в PM, почитал cтатьи Broken Sword`а - уже ось свою пишу! Читайте доки - они рулезз!(C) :) Вот пример:
org 0x100 ; Для DOS'a
;org 0x7C00 ; Для BootSector'а
;
; Точка входа (Реальный режим)
;
start:
;
; Включить линию A20
;
in al,0x92
or al,2
out 0x92,al
;
; Вычислить линейный адресс метки pm_start
;
xor eax,eax
mov ax,cs
shl eax,4
add eax,pm_start
mov [ENTRY_OFF],eax
;
; Вычислить линейный адресс pm_start
;
xor eax,eax
mov ax,cs
shl eax,4
add ax,GDT
;
; Загрузить GDT
;
mov dword [GDTR+2],eax
lgdt fword [GDTR]
;
; Запретить все прерывания (включая NMI)
;
cli
in al,0x70
or al,0x80
out 0x70,al
;
; Перейти в защищённый режим
;
mov eax,cr0
or al,1
mov cr0,eax
;
; Опкод инструкции jmp (это необходимо для загрузки секлектора кода в регистр CS)
;
db 66h ; префикс - изменение разрядности кода (0x66 - 32 бита)
db 0EAh ; опкод jmp
ENTRY_OFF dd ? ; куда прыгать?
dw 00001000b ; селектор
;
; Мы в защищённом режиме :)
;
use32
pm_start:
;
; Загрузим селектор (2й сегмент в таблице - данные) в сегментные регистры
;
mov ax,16
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
mov ss,ax
mov ss,ax
;
; Установим стек
;
mov esp,STACK_TOP
;
; Вешаемся :)
;
hlt
;
; данные
;
GDT:
NULL_descr db 000h,000h,00h,00h,00h,00000000b,00000000b,00h
CODE_descr db 0FFh,0FFh,00h,00h,00h,10011010b,11001111b,00h
DATA_descr db 0FFh,0FFh,00h,00h,00h,10010010b,11001111b,00h
GDT_size equ $-GDT
GDTR dw GDT_size-1
dd ?
;
; Вершина стека - 4Мб
;
STACK_TOP = 1024*1024*4
|
|
|
Дата: Окт 31, 2004 13:13:16 В общем все дело было в эмуляторе оказывается... Он видно не очень хорошо работает =) Спасибо всем ответившим. XDEV86 Вот хотел как раз по этому поводу спросить. В статье дается программа - как я понял чистый exe`шник. С сегментами там и т.п. Вот только чего не пойму - это каким образом предполагается его (по сути выполняемый файл) записывать в бут сектор? Объясните дураку... :) |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.074 |