Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.01.2010, 14:31   #1
deHimer
 
Регистрация: 18.06.2009
Сообщений: 4
По умолчанию jmp illegal descriptor type 0

Вот устал уже летать в догатках.. Почему при переходе в защищенный режим (программа запускается в DOSBOXe 0.72) при выполнение загрузки в сегментный регистр командой lgdt происходит ошибка и вылет?..
Есть догатки?
deHimer вне форума Ответить с цитированием
Старый 06.01.2010, 14:40   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

покажите как формируете сегменты
и также как переходите.
(и я не уверен что досбокс справится)
вам лучше Bochs подойдет(найти образ доса не трудно)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.01.2010, 14:43   #3
deHimer
 
Регистрация: 18.06.2009
Сообщений: 4
По умолчанию

.386p

RM_CODE segment para public 'CODE' use16
assume CS:RM_CODE,SS:RM_STACK
@@start:
; очистка экрана:
mov AX,3
int 10h

; открываем линию А20 (для 32-х битной адресации):
in AL,92h
or AL,2
out 92h,AL

; вычисляем линейный адрес метки ENTRY_POINT (точка входа в защищенный режим):
xor EAX,EAX ; обнуляем регистра EAX
mov AX,PM_CODE ; AX = номер сегмента PM_CODE
shl EAX,4 ; EAX = линейный адрес PM_CODE
add EAX,offset ENTRY_POINT ; EAX = линейный адрес ENTRY_POINT
mov dword ptr ENTRY_OFF,EAX ; сохраняем его в переменной
; (кстати, подобный "трюк" называется SMC или Self Modyfing Code - самомодифицирующийся код)

; теперь надо вычислить линейный адрес GDT (для загрузки регистра GDTR):
xor EAX,EAX
mov AX,RM_CODE ; AX = номер сегмента RM_CODE
shl EAX,4 ; EAX = линейный адрес RM_CODE
add AX,offset GDT ; теперь EAX = линейный адрес GDT

; линейный адрес GDT кладем в заранее подготовленную переменную:
mov dword ptr GDTR+2,EAX
; а подобный трюк назвать SMC уже нельзя, потому как по сути мы модифицируем данные

; собственно, загрузка регистра GDTR:
lgdt fword ptr GDTR

; запрет маскируемых прерываний:
cli

; запрет немаскируемых прерываний:
in AL,70h
or AL,80h
out 70h,AL

; переключение в защищенный режим:
mov EAX,CR0
or AL,1
mov CR0,EAX

; загрузить новый селектор в регистр CS
db 66h ; префикс изменения разрядности операнда
db 0EAh ; опкод команды JMP FAR
ENTRY_OFF dd ? ; 32-битное смещение
dw 00001000b ; селектор первого дескриптора (CODE_descr)

; ТАБЛИЦА ГЛОБАЛЬНЫХ ДЕСКРИПТОРОВ:
GDT:
; нулевой дескриптор (обязательно должен присутствовать в GDT!):
NULL_descr db 8 dup(0)
CODE_descr db 0FFh,0FFh,00h,00h,00h,10011010b,110 01111b,00h
DATA_descr db 0FFh,0FFh,00h,00h,00h,10010010b,110 01111b,00h
VIDEO_descr db 0FFh,0FFh,00h,80h,0Bh,10010010b,010 00000b,00h
GDT_size equ $-GDT ; размер GDT

GDTR dw GDT_size-1 ; 16-битный лимит GDT
dd ? ; здесь будет 32-битный линейный адрес GDT
RM_CODE ends
; ---------------------------------------------------------------------------------------------------------



; СЕГМЕНТ СТЕКА (для Real Mode)
; ---------------------------------------------------------------------------------------------------------
RM_STACK segment para stack 'STACK' use16
db 100h dup(?) ; 256 байт под стек - это даже много
RM_STACK ends
; ---------------------------------------------------------------------------------------------------------



; СЕГМЕНТ КОДА (для Protected Mode)
; ---------------------------------------------------------------------------------------------------------
PM_CODE segment para public 'CODE' use32
assume CS:PM_CODE,DS:PM_DATA
ENTRY_POINT:
; загрузим сегментные регистры селекторами на соответствующие дескрипторы:
mov AX,00010000b ; селектор на второй дескриптор (DATA_descr)
mov DS,AX ; в DS его
mov AX,00011000b ; селектор на третий дескриптор (VIDEO_descr)
mov ES,AX ; а этого в ES

xor SI,SI ; обнуляем SI
mov SI,PM_DATA ; SI = номер сегмента PM_DATA
shl ESI,4 ; ESI = линейный адрес сегмента PM_DATA
add ESI,offset message ; ESI = линейный адрес строки message
xor EDI,EDI ; EDI = позиция на экране (относительно 0B8000h)
mov ECX,mes_len ; длина текста в ECX

; вывод на экран:
rep movsb ; DS:ESI (наше сообщение) -> ES:EDI (видеопамять)
jmp $ ; погружаемся в вечный цикл
PM_CODE ends
; ---------------------------------------------------------------------------------------------------------

; СЕГМЕНТ ДАННЫХ (для Protected Mode)
; ---------------------------------------------------------------------------------------------------------
PM_DATA segment para public 'DATA' use32
assume CS:PM_DATA

; сообщение, которое мы будем выводить на экран (оформим его в виде блока повторений irpc):
message:
irpc mes,
db '&mes&',0Dh
endm
mes_len equ $-message ; длина в байтах
PM_DATA ends
; ---------------------------------------------------------------------------------------------------------

end @@start
deHimer вне форума Ответить с цитированием
Старый 06.01.2010, 15:01   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

первое что вы должны сделать после включения защищенного режима это дальний прыжок в 32 битный код.

увидел вашу попытку дальнего прыжка...но только что это такое?
Код:
db 66h ; префикс изменения разрядности операнда
db 0EAh ; опкод команды JMP FAR
ENTRY_OFF dd ? ; 32-битное смещение
dw 00001000b ; селектор первого дескриптора (CODE_descr)
вероятно вам нужно это?
Код:
	db	0eah			; Этими пятью байтами кодируется команда
	dw	P_Mode_entry		;  jmp far Code_selector:P_Mode_entry
	dw	Code_selector
надеюсь знаете что где

могу кинуть 100% рабочий кусок как пример на NASMе(пример мой, тестил и на Bochs и на реальном компе)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 06.01.2010 в 15:09.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.01.2010, 15:09   #5
deHimer
 
Регистрация: 18.06.2009
Сообщений: 4
По умолчанию

Буду рад!) Можно сюда, а можно и на ящик den_vse@mail.ru
deHimer вне форума Ответить с цитированием
Старый 06.01.2010, 15:16   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
	cli
	mov eax,cr0
	or eax,1
	mov cr0,eax
	jmp 0x08:0      ;селектор 8(дескриптор 2)
                      ;смещение ноль, так как дескриптор указывает на метку protected
gdt:                       ; наша GDT
	gdt_null:
		dd 0,0
	gdt_code:
		dd 0,0
	gdt_stack:
		dd 0,0
	gdt_data:
		dd 0,0
	gdt_screen:
		dd 0,0
gdt_end:
gd_reg:                     ;значение для GDTR
	dw gdt_end-gdt-1
	dd gdt
[BITS 32]
protected:                       ;устанавливаем сегментные регистры
	mov	ax,32
	mov	es,ax
	mov	ax,24
	mov	ds,ax
	mov	ax,16
	mov	ss,ax
	mov	sp,0
	sti
советую почитать это
особенно главу 9
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 06.01.2010 в 15:18.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.01.2010, 15:30   #7
deHimer
 
Регистрация: 18.06.2009
Сообщений: 4
По умолчанию

Спасибо за помощь! Буду раскладывать по полочкам=)
deHimer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ошибка error C2043: illegal break Ongi Общие вопросы C/C++ 7 04.01.2012 20:55
Illegal assignment mmx358 Паскаль, Turbo Pascal, PascalABC.NET 7 08.08.2009 15:22
ERROR:Illegal indexing mode IgorKr Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 13.12.2008 23:54
Ошибка(C++): error C2041: illegal digit '9' for base '8' TheWanderer Общие вопросы C/C++ 4 02.10.2008 21:11
Illegal mix of collations VasyaVasin PHP 1 27.12.2007 08:00