Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031

Нереальный режим

03.08.2013, 12:32. Показов 1801. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть код перехода в нереальный режим:

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
60
61
GDT:
    db    8 dup(0)         ; нулевой дескриптор
; 16-битный 4 Гб сегмент:
    db    0FFh,0FFh,0,0,0,10010010b,11001111b,0;1001001b,11001111b,0
gdtr    dw    16               ; размер GDI
gdt_base dd   ?            ; линейный адрес GDT
 
; код программы
; определить линейный адрес GDT
      sta1: 
mov [disk_id], dl
mov ah, 0Eh
mov al,dl
;add al,30h
int 10h
 
 
 
mov eax,0
 ;xor        еах,еах
    mov    ax,cs
    shl    eax,4
    add    ax,offset GDT
; загрузить GDT из одного дескриптора (не считая нулевого)
    mov    gdt_base,eax
 
 
; Откроем адресную линию A20 Этот код мы добавили
    in al, 92h
    or al, 2
    out 92h, al
 
    lgdt       fword ptr gdtr
; перейти в защищенный режим
    cli
    mov    eax,cr0
    or     al,1
    mov    cr0,eax
    jmp    start_PM        ; сбросить очередь предвыборки
                       ; Intel рекомендует
start_PM:                  ; делать jmp после каждой смены режима
; загрузить все сегментные регистры дескриптором с лимитом 4 Гб
    mov    ax,8            ; 8 - селектор нашего дескриптора
    mov    ds,ax
    mov    es,ax
    mov    fs,ax
    mov    gs,ax           ; перейти в реальный режим
    mov    eax,cr0
    and    al,0FEh
    mov    cr0,eax
    jmp    exit_PM
exit_PM:
; записать что-нибудь в каждый сегментный регистр
    mov ax,0
    mov    ds,ax
    mov    es,ax
    mov    fs,ax
    mov    gs,ax
    sti
    mov    ax,cs
    mov    ds,ax
Но он работает только в VirtualBox, в Bochs м на реальном железе ребутается.
Bochs говорит в логе при обращении к видеопамяти таким образом:

Assembler
1
2
3
4
5
push 0B800h
pop es
mov bx,0
mov al,1
mov es:[bx],al
, что отсутствуют права доступа к данной памяти.
Похоже дело в том, что сбрасываются лимиты до 64 кбайт.

Вопрос: Как правильно переводить процессор в нереальный режим.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.08.2013, 12:32
Ответы с готовыми решениями:

Переход в нереальный режим в загрузчике
Требуется написать загрузчик ОС Windows c подсчётом контрольной суммы ROM BIOS. ROM BIOS Расположен в верхних областях памяти, начинаясь с...

Нереальный прегрев процессора
Уважаемые пользователи и гуру форума объясните возможные причины перегрева пожалуйста. Проц AMD X2 64 6000+ (Core Duo), материнка MSI....

Нереальный размер 2D игрушки в Unity3D
Доброй ночи, уважаемые жители киберфорума. Я недавно стал увлекаться разработкой игр под Unity3D. Вчера завершил свою одну 2D игрушку....

7
601 / 468 / 73
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
03.08.2013, 12:53
как-то странно, помоему вы просто забыли установить сегмент стека, разве нет? я не могу найти в вашем коде ss (ну и sp). При этом вы используете push... передайте 0b800h в es через регистры, или установите сегмент стека.
В виртуальных машинах он скорее всего инициализируется нулем, а на реальной машине там может находиться рандомное число, отсюда имхо и проблемы...
1
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031
03.08.2013, 14:02  [ТС]
Цитата Сообщение от NEbO Посмотреть сообщение
разве нет?
Точно... Забыл инициализировать стек

Добавлено через 7 минут
Разместил в начале кода
Assembler
1
2
3
4
5
6
7
8
cli
mov sp,7C00h
xor ax,ax
mov ds,ax
mov es,ax
mov fs,ax
mov ss,ax
sti
, но программа как не работала, так и не работает.
Bochs ругается

Assembler
1
 write_virtual_checks():no write access to seg
0
601 / 468 / 73
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
03.08.2013, 14:15
а в каком месте-то это происходит? вы в одном месте только ss определили? в PM у вас ss останется равным 0, а селектор первого дескриптора (не путаю терминологию?) будет 0x8. вам нужно либо два сегмента чтоли... либо один, но с возможностью записи в него, и еще как-то так инициализировать адреса, чтобы данные и стек не "заползали" на код
0
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031
03.08.2013, 14:19  [ТС]
Нет, дескриптор не надо загружать.
Потому что
Assembler
1
2
3
mov    eax,cr0
    and    al,0FEh
    mov    cr0,eax
И вылетаем из защищенного режима в реальный, с расширенными сегментами, а фрагмент прямой записи в видеопамять выполняется уже после выхода из защищенного режима.
0
601 / 468 / 73
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
03.08.2013, 14:31
ну не надо, значит не надо. Вам, вероятно, виднее: с нереальным режимом я вообще не работал. Да и вы же не указали, куда именно ставите ваш код работы с видеопамятью
в конце концов я бы на вашем месте на всякий пожарный проинициализировал ss еще раз после "выхода" из PM. И заодно бы глянул в дамп: где конкретно остановился, и какие значения у регистров.
Кстати, заметил еще одну странность: насколько я помню, при смене режима нужно использовать far jmp, а не near. С целью установить cs в 0x8... ну а потом сбросить его в 0. мне вообще кажется странным, что ваш код работает
1
116 / 136 / 0
Регистрация: 15.04.2012
Сообщений: 1,031
03.08.2013, 14:38  [ТС]
Цитата Сообщение от NEbO Посмотреть сообщение
нужно использовать far jmp, а не near. С целью установить cs в 0x8... ну а потом сбросить его в 0
Спасибо за совет.
0
435 / 246 / 43
Регистрация: 05.08.2013
Сообщений: 1,670
08.08.2013, 08:42
Цитата Сообщение от programmisto Посмотреть сообщение
push 0B800h
pop es
вы загружаете селектор, а не сегментный адрес. либо определите сегмент видеопамяти по адресу 0B8000, либо загрузите в es единственный селектор и пишите в видеопамять по адресу 0B8000h
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.08.2013, 08:42
Помогаю со студенческими работами здесь

Гениальная идея вируса или нереальный бред?
Возьмем к примеру взлом криптобиржи, ту же бинанс. Закачав нежелательное ПО, через кей логер или куки злоумышленник узнает пароль нашего...

Comodo - нереальный трафик даже после удаления
Столкнулся на работе с винлокерами. Целая эпидемия. Не помог ни свежайший DrWeb LiveCD, ни Dr.Web CureIt!, ни Авира (которая стояла на этих...

Окно набора текста "отвыделяется" и нереальный пинг
В общем, появилась проблема 2 дня назад. Во время набора текста, курсор пропадает и текст собственно больше никуда не печатается...

Как узнать почему включается энергосберегающий режим.И выключить навсегда этот режим?
Вообщем дело такое, гаснет монитор и появляется сообщение "Енергосберегающий режим" и в играх и даже когда не играю, монитор LG...

Как можно из VB переключить режим 800х600 на режим 1024х768.
Как можно из VB переключить режим 800х600 на режим 1024х768. Благодарю за помощь


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
[В процессе разработки] SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru