Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Nola
3 / 3 / 0
Регистрация: 21.03.2015
Сообщений: 26
1

Возврат в реальный режим из защищенного

04.01.2016, 01:56. Просмотров 860. Ответов 1
Метки нет (Все метки)

Есть программа-загрузчик, в которой загружается таблица GDT и выполняется переход в защищённый режим.
Но возникла необходимость использовать 15 прерывание после работы в защищённом режиме.
Пыталась перейти таким способом:
Assembler
1
2
3
4
5
6
7
    mov eax, cr0 ; прочитать CR0
    and al, 0x0FE
    mov cr0, eax ; с этого момента процессор работает в реальном режиме
 
    sti
    
    ... ; код с прерыванием
Компьютер зависает на команде sti, а если без неё, то зависает на прерывании.
Подскажите, как правильно перейти обратно в реальный режим?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2016, 01:56
Ответы с готовыми решениями:

Графический режим -> возврат в текстовый.
Как, будучи в графическом режиме (al - 19; ah - 0; int 10), вернуться назад в...

Реальный и защищенный режим адресации памяти
Вот, пишет один: "если мы воспользуемся какой-либо программой для исследования...

Теория защищенного режима
Могут ли в каких-либо случаях перекрываться сегменты стека и данных на...

Каков реальный размер первичного загрузчика в дискете?
Читаю кулакова. структура MBR такова: jmp_boot - 3 bytes OEM_name - 8 bytes...

Реальный режим
делаю переход в pm так gtl: ziro: dd 0 dd 0 data32: dw 0ffffh dw 0000h...

1
R71MT
3708 / 1336 / 291
Регистрация: 29.07.2014
Сообщений: 2,388
Записей в блоге: 5
04.01.2016, 08:53 2
Лучший ответ Сообщение было отмечено Taatshi как решение

Решение

Код (FASM) переходит с реального в защищённый режим,..оставляет там мессагу, и уходит опять в реальный. Текст идёт прямо в видео/буфер, поэтому вставлены атрибуты после каждого символа:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
ORG 100h
JMP start
 
mess0   DB  'D',7,'e',7,'m',7,'o',7,'n',7,' ',7    ; строка с атрибутами символов
        DB  'G',7,'r',7,'a',7,'p',7,'h',7,'i',7,'t',7,'i',7
size    =   $ - mess0
error   DB  'ERROR! It is PM/V86 mode.',13,10
        DB  'Please, run this programm from CPU RM-mode.$'
 
start:
   PUSH  CS
   POP   DS                  ; DS = сегмент кода нашей программы
   PUSH  0B800h
   POP   ES                  ; ES = сегмент видеопамяти
 
;// проверим почву под ногами: реал или виртуал/протектед
   MOV   EAX,CR0             ; прочитать регистр CR0
   TEST  AL,1                ; проверить бит(РЕ)
   JZ    rMode               ; если нуль, то мы в реале и можем продолжать
 
   MOV   DX,error            ; иначе - сообщить об ошибке и выйти.
   MOV   AH,9
   INT   21h 
   XOR   AX,AX
   INT   16h
   INT   20h                    ; конец СОМ-программы
 
;НННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННННН   
rMode:
   CLI                       ; запретить маскируемые прерывания
   IN    AL,70h              ; индексный порт CMOS
   OR    AL,80h              ; установка бита(7) в нём запрещает NMI
   OUT   70h,AL              ; все прерывания запрещены!
   
;// перейти в защищённый режим
   MOV   EAX,CR0             ; прочитать регистр CR0
   OR    AL,1                ; установить бит(РЕ)
   MOV   CR0,EAX             ; с этого момента мы в защищённом режиме!
   
; вывод на экран
   XOR   DI,DI               ; ES:DI - начало видеопамяти
   MOV   SI,mess0            ; DS:SI - выводимый текст
   MOV   CX,size             ; длинна строки
   REP   MOVSB               ; выводим текст на экран
   
; переключаемся в реальный режим
   MOV   EAX,CR0             ; прочитать CR0
   AND   AL,0FEh             ; сбросить бит(РЕ)
   MOV   CR0,EAX             ; мы опять в реале!
 
; разрешить все прерывания
   IN    AL,70h              ; индексный порт CMOS
   AND   AL,7Fh              ; сброс бита(7) отменяет блокировку NMI
   OUT   70h,AL              ; записываем значение в порт
   STI                       ; разрешить маскируемые прерывания
 
   XOR   AX,AX               ; конец программы
   INT   16h
   INT   20h
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2016, 08:53

Загрузка защищенного файла
Добрый день, подскажите как сделать загрузку файла в бд? Ситуация такая если...

Создание защищенного процесса
Подскажите как сделать чтоб процесс программы нельзя было убить через...

IBM и копирование защищенного раздела
Добрый день! Имеется 2 абсолютно одинаковых ноута IBM. Кто скажет можно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru