Форум программистов, компьютерный форум, киберфорум
Наши страницы

Assembler, MASM, TASM

Войти
Регистрация
Восстановить пароль
 
matvey528
0 / 0 / 0
Регистрация: 23.12.2010
Сообщений: 4
#1

переключение в защищенный режим средствами DPMI - Assembler

23.12.2010, 17:14. Просмотров 812. Ответов 0
Метки нет (Все метки)

Программа взята из учебника и все ровное не компилиться. Подскажите как её откомпилировать. А компилировал с помощью tasm
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
; Выполняет переключение в защищенный режим средствами DPMI
.386 ; 32-битный защищенный режим появился в 80386
; 16-битный сегмент - в нем выполняется подготовка и переход в защищенный режим
RM_seg segment byte public use16
assume cs:RM_seg, ds:PM_seg, ss:RM_stack
 
; точка входа программы
RM_entry:
; проверить наличие DPMI
mov ax,1687h ; номер 1678h
int 2Fh ; прерывание мультиплексора,
test ax,ax ; если АХ не ноль,
jnz DPMI_error ; произошла ошибка (DPMI отсутствует),
test bl,1 ; если не поддерживается 32-битный режим,
jz DPMI_error ; нам тоже нечего делать
 
; подготовить базовые адреса для будущих дескрипторов
mov eax,PM_seg
mov ds,ax ; DS - сегментный адрес PM_seg
shl eax,4 ; EAX - линейный адрес начала сегмента PM_seg
mov dword ptr PM_seg_addr,eax
or dword ptr GDT_flatCS+2,eax ; дескриптор для CS
or dword ptr GDT_flatDS+2,eax ; дескриптор для DS
 
; сохранить адрес процедуры переключения DPMI
mov word ptr DPMI_ModeSwitch,di
mov word ptr DPMI_ModeSwitch+2,es
 
; ES должен указывать на область данных для переключения режимов,
; у нас она будет совпадать с началом будущего 32-битного стека
add eax,offset DPMI_data ; добавить к EAX смещение
shr eax,4 ; и превратить в сегментный адрес
inc ax
mov es,ax
 
; перейти в защищенный режим
mov ax, 1 ; АХ = 1 - мы будем 32 приложением
ifdef _WASM_
db 67h ; поправка для wasm
endif
call dword ptr DPMI_ModeSwitch
jc DPMI_error ; если переключения не произошло - выйти
 
; теперь мы находимся в защищенном режиме, но лимиты всех сегментов
; установлены на 64 Кб, а разрядности сегментов - на 16 бит.
; Нам надо подготовить два
; 32-битных селектора с лимитом 4 Гб - один для кода и один для данных
push ds
pop es ; ES вообще был сегментом PSP с лимитом 100h
mov edi,offset GDT ; EDI - адрес таблицы GDT
; цикл по всем дескрипторам в нашей GDT,
mov edx,1 ; которых всего два (0, 1) sel_loop:
xor ax,ax ; функция DPMI 00
mov cx,1
int 31h ; создать локальный дескриптор
mov word ptr selectors[edx*2],ax ; сохранить селектор
mov bx,ax ; в таблицу selectors
mov ax,000Ch ; функция DPMI OCh
int 31h ; установить селектор
add di,8 ; EDI - следующий дескриптор
dec dx
jns sel_loop
 
; загрузить селектор сегмента кода в CS при помощи команды RETF
push dword ptr Sel_flatCS ; селектор для CS
ifdef _WASM_
db 066h
endif
push offset PM_entry ; EIP
db 066h ; префикс размера операнда
retf ; выполнить переход в 32-битный сегмент
 
; сюда передается управление, если произошла ошибка при инициализации DPMI
; (обычно, если DPMI просто нет)
DPMI_error:
push cs
pop ds
mov dx,offset nodpmi_msg
mov ah,9h ; вывод строки на экран
int 21h
mov ah,4Ch ; конец ЕХЕ-программы
int 21h
nodpmi_msg db "error DPMI$"
RM_seg ends
 
; сегмент PM_seg содержит код, данные и стек для защищенного режима
PM_seg segment byte public use32
assume cs:PM_seg,ds:PM_seg,ss:PM_seg
; таблица дескрипторов
GDT label byte
; дескриптор для CS
GDT_flatCS db 0FFh,0FFh,0h,0h,0h,0FAh,0CFh,0h
; дескриптор для DS
GDT_flatDS db 0FFh,0FFh,0h,0h,0h,0F2h,0CFh,0h
 
; точка входа в 32-битный режим - загружен только CS
PM_entry:
mov ax,word ptr Sel_flatDS ; селектор для данных
mov ds,ax ; в DS
mov es,ax ; в ES
mov ss,ax ; и в SS
mov esp,offset PM_stack_bottom ; и установить стек
; отсюда начинается текст собственно программы,
; программа работает в модели памяти flat с ненулевой базой,
; база CS, DS, ES и SS совпадает и равна линейному адресу начала PM_seg
; все лимиты - 4 Гб
mov ах,0300h ; функция DPMI 0300h
mov bx,0021h ; прерывание DOS 21h
xor ecx,ecx ; стек не копировать
mov edi,offset v86_regs ; ES:EDI - адрес v86_regs
int 31h ; вызвать прерывание
 
mov ah,4Ch ; Это единственный способ
int 21h ; правильно завершить DPMI-программу
 
hello_msg db "Hello world из 32-битного защищенного режима!$"
 
v86_regs: ; значения регистров для функции DPMI ОЗООп
dd 0,0,0,0,0 ; EDI, ESI, EBP, 0, ЕВХ
v_86_edx dd offset hello_msg ; EDX
dd 0 ; ЕСХ
v86_eax dd 0900h ; EAX (AH = 09h, вывод строки на экран)
dw 0,0 ; FLAGS, ES
v86_ds dw PM_seg ; DS
dw 0,0,0,0,0,0 ; FS, GS, 0, 0, SP, SS
 
; различные временные переменные, нужные для переключения режимов
DPMI_ModeSwitch dd ? ; точка входа DPMI
PM_seg_addr dd ? ; линейный адрес сегмента PM_seg
 
; значения селекторов
selectors:
Sel_flatDS dw ?
Sel_flatCS dw ?
 
; стек для нашей 32-битной программы
DPMI_data: ; и временная область данных DPMI одновременно
db 16384 dup (?)
PM_stack_bottom:
PM_seg ends
 
; стек 16-битной программы, который использует DPMI-сервер при переключении режимов
; Windows 95 требует 16 байт
; CWSDPMI требует 32 байта
; QDPMI требует 96 байт
; мы выберем по максимуму
RM_stack segment byte stack "stack" use16
db 96 dup (?)
RM_stack ends
end RM_entry ; точка входа для DOS - RM_entry
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.12.2010, 17:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос переключение в защищенный режим средствами DPMI (Assembler):

защищенный режим - Assembler
Как преобразовать программу из формата .COM в формат .EXE.?

защищенный режим - Assembler
люди разъясните кто знает.надо переключить проц в защищенный режим работы. часть кода code segment ...... db 0eah ;(1)машинный...

Защищенный режим - Assembler
Доброе время суток, помогите с таким заданием, заранее большое спасибо: - проверка присутствия сегмента; - проверка защиты от загрузки...

Защищенный режим. Работа с сегментами. - Assembler
Прошу помощи с компилом: ; pm1.asm ; Программа, демонстрирующая работу с сегментами в защищенном режиме, ; переключается в модель...

Защищенный режим работы процессора: нужна литература - Assembler
Дайте хорошую литературу по защищенному режиму с наличием примеров кода.

Защищенный режим: как использовать прерывания BIOS из PM - Assembler
в защищенном режиме я так понимаю нальзя использовать прерывания так, как это делается в реальном. тогда как мне использовать прерывания...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2010, 17:14
Привет! Вот еще темы с ответами:

Защищенный режим и ошибка "CMOS checksum error" - Assembler
написал прогу (опять таки из книги) для перехода в защищенный режим... загрузился из-под флешки с досей, запустил прогу, зашел в защищенный...

защищенный режим - Assembler
а как можно изменить длину сегмента (предел) и потом снова считать его? Написать процедуру, меняющую в защищенном режиме предел ...

Защищенный режим DOS - С++ - C++
Нужна помощь!!! Надо написать программу на С++ для защищенного режима DOS. В проге надо записать данные в переменную до 100 мб а потом...

Переход в защищенный режим - Assembler
Собственно интересует один аспект в коде: jmp fword 08h:Startup32 - что за "fword 08h:" на сайте(https://habrahabr.ru/post/118881/)...


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

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

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