Форум программистов
 
Расширенный поиск
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler
Регистрация

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

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

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

icq: 446843180
skype: phoenix_proger
По умолчанию

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

.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, 16:01   #4
Пепел Феникса
Модератор
Заслуженный модератор
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Адрес: Москва
Сообщений: 20,998
Репутация: 3402

icq: 446843180
skype: phoenix_proger
По умолчанию

первое что вы должны сделать после включения защищенного режима это дальний прыжок в 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 в 16:09.
Пепел Феникса вне форума   Ответить с цитированием
Старый 06.01.2010, 16:09   #5
deHimer
 
Регистрация: 18.06.2009
Сообщений: 4
Репутация: 10
По умолчанию

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

icq: 446843180
skype: phoenix_proger
По умолчанию

Код:

	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 в 16:18.
Пепел Феникса вне форума   Ответить с цитированием
Старый 06.01.2010, 16:30   #7
deHimer
 
Регистрация: 18.06.2009
Сообщений: 4
Репутация: 10
По умолчанию

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



Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ошибка error C2043: illegal break Ongi Общие вопросы C/C++ 7 04.01.2012 20:55
Illegal assignment mmx358 Паскаль 7 08.08.2009 15:22
ERROR:Illegal indexing mode IgorKr Assembler 1 14.12.2008 00: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 09:00




12:13.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

купить трафик


как улучшить посещаемость, а также решения по монетизации сайтов, видео и приложений

RusProfile.ru


Справочник российских юридических лиц и организаций.
лучший хостинг
Выбираем лучший хостинг: рейтинг ТОП 10
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru