Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/22: Рейтинг темы: голосов - 22, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 28.06.2009
Сообщений: 7

Защищенный режим. Работа с сегментами.

01.12.2010, 01:41. Показов 4821. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Прошу помощи с компилом:

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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
; pm1.asm
; Программа, демонстрирующая работу с сегментами в защищенном режиме,
; переключается в модель flat, выполняет вывод на экран и возвращается в DOS
;
; Компиляция: TASM:
; tasm /m pm1.asm
; tlink /x /3 pm1.obj
; MASM:
; ml /c pm1.asm
; link pm1.obj,,NUL,,,
; WASM:
; wasm pm1.asm
; wlink file pm1.obj form DOS
 
.386p ; 32-битный защищенный режим появился в 80386
 
; 16-битный сегмент, в котором находится код для входа
; и выхода из защищенного режима
RM_seg segment para public "code" use16
assume CS:RM_seg,SS:RM_stack
start:
; подготовить сегментные регистры
push cs
pop ds
; проверить, не находимся ли мы уже в РМ
mov еах,cr0
test al,1
jz no_V86
; сообщить и выйти
mov dx,offset v86_msg
err_exit:
mov ah,9
int 21h
mov ah,4Ch
int 21h
v86_msg db "Процессор в режиме V86 - нельзя переключиться в РМ$"
win_msg db "Программа запущена под Windows - нельзя перейти в кольцо 0$"
 
; может быть, это Windows 95 делает вид, что РЕ = 0?
no_V86:
mov ax,1600h ; Функция 1600h
int 2Fh ; прерывания мультиплексора,
test al,al ; если AL = 0,
jz no_windows ; Windows не запущена
; сообщить и выйти, если мы под Windows
mov dx,offset win_msg
jmp short err_exit
 
; итак, мы точно находимся в реальном режиме
no_windows:
; если мы собираемся работать с 32-битной памятью, стоит открыть А20
in al,92h
or al,2
out 92h,al
; вычислить линейный адрес метки PM_entry
xor еах,еах
mov ax,PM_seg ; АХ - сегментный адрес PM_seg
shl eax,4 ; ЕАХ - линейный адрес PM_seg
add eax,offset PM_entry ; EAX - линейный адрес PM_entry
mov dword ptr pm_entry_off,eax ; сохранить его
; вычислить базу для GDT_16bitCS и GDT_16bitDS
xor eax,eax
mov ax,cs ; AX - сегментный адрес RM_seg
shl eax,4 ; ЕАХ - линейный адрес RM_seg
push eax
mov word ptr GDT_16bitCS+2,ax ; биты 15 - 0
mov word ptr GDT_16bitDS+2,ax
shr eax,16
mov byte ptr GDT_16bitCS+4,al ; и биты 23 - 16
mov byte ptr GDT_16bitDS+4,al
; вычислить абсолютный адрес метки GDT
pop eax ; EAX - линейный адрес RM_seg
add ax,offset GDI ; EAX - линейный адрес GDT
mov dword ptr gdtr+2,eax ; записать его для 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
pm_entry_off dd ? ; 32-битное смещение
dw SEL_flatCS ; селектор
RM_return: ; сюда передается управление при выходе из защищенного режима
; переключиться в реальный режим
mov еах,cr0
and al,0FEh
mov cr0,eax
; сбросить очередь предвыборки и загрузить CS реальным сегментным адресом
db 0EAh ; код дальнего jmp
dw $+4 ; адрес следующей команды
dw RM_seg ; сегментный адрес RM_seg
; разрешить NMI
in al,70h
and al,07Fh
out 70h,al
; разрешить другие прерывания
sti
; подождать нажатия любой клавиши
mov ah,0
int 16h
; выйти из программы
mov ah,4Ch
int 21h
; текст сообщения с атрибутами, который мы будем выводить на экран
message db 'Н',7,'е',7,'l',7,'l',7,'о',7,' ',7,'и',7,'з',7,' ',7
db '3',7,'2',7,'-',7,'б',7,'и',7,'т',7,'н',7,'о',7,'г',7
db 'о',7,' ',7,'Р',7,'М'
message_l = $ - message ; длина в байтах
rest_scr = (80*25*2-message_l)/4 ; длина оставшейся части экрана
; в двойных словах
; таблица глобальных дескрипторов
GDT label byte
; нулевой дескриптор (обязательно должен быть на первом месте)
db 8 dup(0)
; 4-гигабайтный код, DPL = 00:
GDT_flatCS db 0FFh,0FFh,0,0,0,10011010b,11001111b,0
; 4-гигабайтные данные, DPL = 00:
GDT_flatDS db 0FFh,0FFh,0,0,0,10010010b,11001111b,0
; 64-килобайтный код, DPL = 00:
GDT_16bitCS db 0FFh,0FFh,0,0,0,10011010b,0,0
; 64-килобайтные данные, DPL = 00:
GDT_16bitDS db 0FFh,0FFh,0,0,0,10010010b,0,0
GDT_l = $ - GDT ; размер GDT
 
gdtr dw GDT_l-1 ; 16-битный лимит GDI
dd ? ; здесь будет 32-битный линейный адрес GDT
; названия для селекторов (все селекторы для GDT, с RPL = 00)
SEL_flatCS equ 00001000b
SEL_flatDS equ 00010000b
SEL_16bitCS equ 00011000b
SEL_16bitDS equ 00100000b
 
RM_seg ends
 
; 32-битный сегмент, содержащий код, который будет исполняться в защищенном
; режиме
PM_seg segment para public "CODE" use32
assume cs:PM_seg
PM_entry:
; загрузить сегментные регистры (кроме SS для простоты)
mov ax,SEL_16bitDS
mov ds,ax
mov ax,SEL_flatDS
mov es,ax
; вывод на экран
mov esi,offset message ; DS:ESI - сообщение
mov edi,0B8000h ; ES:EDI - видеопамять
mov ecx,message_l ; ECX - длина
rep movsb ; вывод на экран
mov eax,07200720h ; два символа 20h с атрибутами 07
mov ecx,rest_scr ; остаток экрана / 2
rep stosd ; очистить, остаток экрана
; загрузить в CS селектор 16-битного сегмента RM_seg
db 0EAh ; код дальнего jmp
dd offset RM_return ; 32-битное смещение
dw SEL_16bitCS ; селектор
PM_seg ends
 
; сегмент стека - используется как в 16-битном, так и в 32-битном режимах
; так как мы не трогали SS, он все время оставался 16-битным
RM_stack segment para stack "STACK" use16
db 100h dup(?)
RM_stack ends
end start
Turbo Assembler Version 4.1 Copyright (c) 1988, 1996 Borland International

Assembling file: pm1.asm
**Error** pm1.asm(26) Too few operands to instruction
*Warning* pm1.asm(26) Argument needs type override
**Error** pm1.asm(47) Relative jump out of range by 0004h bytes
**Error** pm1.asm(56) Too few operands to instruction
*Warning* pm1.asm(56) Argument needs type override
**Error** pm1.asm(73) Undefined symbol: GDI
**Error** pm1.asm(94) Too few operands to instruction
*Warning* pm1.asm(94) Argument needs type override
Error messages: 5
Warning messages: 3
Passes: 2
Remaining memory: 415k

Реакция MASM32 v10:
Assembling: pm1.asm
pm1.asm(26) : error A2044: invalid character in file
pm1.asm(56) : error A2044: invalid character in file
pm1.asm(94) : error A2044: invalid character in file
pm1.asm(73) : error A2006: undefined symbol : GDI

Опробировано на WinXP и DOS-эмуляторе - результат одинаковый.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.12.2010, 01:41
Ответы с готовыми решениями:

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

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

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

11
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
01.12.2010, 04:51
Dandula,
1) pm1.asm(26) mov eax,cr0 в eax русские символы
2) pm1.asm(56) xor еах,еах в eax русские символы
3) pm1.asm(94) mov eax,cr0 в eax русские символы
4) pm1.asm(73) add ax,offset GDI ; EAX - линейный адрес GDT переменная GDI в комментарии GDT
будь внимательнее!
1
0 / 0 / 0
Регистрация: 28.06.2009
Сообщений: 7
01.12.2010, 11:32  [ТС]
Зевок с GDI исправил Но количество ошибок как ни странно увеличилось. Что делать с командой перехода на ТАСМе тоже пока вопрос.
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
01.12.2010, 11:40
Цитата Сообщение от Dandula Посмотреть сообщение
Что делать с командой перехода на ТАСМе тоже пока вопрос
это вы о чем? Если о
Цитата Сообщение от Dandula Посмотреть сообщение
**Error** pm1.asm(47) Relative jump out of range by 0004h bytes
просто уберите short. У меня во всяком случае все скомпилировалось без ошибок. На счет правильности работы не знаю, не проверял
1
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
01.12.2010, 11:49
Dandula, так покажи исправленный текст и строки с ошибками
0
0 / 0 / 0
Регистрация: 28.06.2009
Сообщений: 7
01.12.2010, 12:05  [ТС]
Прошу прощения - не вводил ключ при компиляции. Еще один момет - как убрать русские символы из eax? Что вы имели в виду: сообщения или что-то иное? Англофикацией сообщений в коде проблема не решилась - осталось:

Turbo Assembler Version 4.1 Copyright (c) 1988, 1996 Borland International

Assembling file: pm1.asm
**Error** pm1.asm(26) Too few operands to instruction
*Warning* pm1.asm(26) Argument needs type override
**Error** pm1.asm(56) Too few operands to instruction
*Warning* pm1.asm(56) Argument needs type override
**Error** pm1.asm(94) Too few operands to instruction
*Warning* pm1.asm(94) Argument needs type override
Error messages: 3
Warning messages: 3
Passes: 2
Remaining memory: 415k

Как это побороть?
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
01.12.2010, 12:19
Dandula, ты видимо не понял, там в командах часть букв написана по русски, часть по английски(у меня копи/паст Зубкова дает тот же результат, видимо сканировали и так распозналось). Просто перепиши строки на которые указывает компилятор заново
1
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
01.12.2010, 12:31
Цитата Сообщение от Dandula
как убрать русские символы из eax?
И после этого пытаться писать программы по переходу в защищенный режим и работе с сегментами. А не рано?
1
0 / 0 / 0
Регистрация: 28.06.2009
Сообщений: 7
01.12.2010, 12:35  [ТС]
Всем сасибо за помощь! На этот раз все нормально скомпилилось.
P.S. Первоначаьно еще исправлял в Far с плагином Colorer и в командах с кириллицей исправлял операнды не с тем цветом подсветки - вот и возникла гупая ситуация.
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
01.12.2010, 12:46
Dandula, так в Far'e сразу видно, что это не регистр а переменная
Вложения
Тип файла: rar temp.rar (53.7 Кб, 36 просмотров)
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
01.12.2010, 13:18
Dandula, во вложении исходные тексты и скомпилированные экзе и ком разных авторов, но на одну и ту же тему переход из реального в защищенный и обратно, посмотри -- может быть пригодится

1) К.Г.Финогенов "Использование языка ассемблера" стр 209
2) Юров Хорошенко Assembler: учебный курс 1999 стр 431
3) Зубков С.В. "Assembler для Windows, DOS и Unix" стр 493
4) П.И.Рудаков К.Г.Финогенов "Язык ассемблера: уроки программирования" стр 286
5) Broken Sword цикл статей "Процессор Intel в защищенном режиме" на сайте WASM.RU
6) статья с сайта http://palien.narod.ru/Documen... ge0012.htm "Пример простой программы переключения режима"
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
01.12.2010, 13:32
Цитата Сообщение от Mikl___ Посмотреть сообщение
5) Broken Sword цикл статей "Процессор Intel в защищенном режиме" на сайте WASM.RU
рекомендую начать с этой. Сам оттуда начинал когда то - проще объяснять наверно невозможно.
Ну и можно добавить к этому списку intel manuals - по английски, зато наиболее полно и из первоисточника
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.12.2010, 13:32
Помогаю со студенческими работами здесь

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

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

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

Связь сегментных регистров с сегментами
При написании *.com програм адреса в сегментные регистры заносятся директивой assume assume cs:code, ds:data, ss:stack Вопрос: зачем...

Защищенный режим asm
Здравствуйте! Имеется программка в Реальном режиме, необходимо перевести ее в защищенный. Подскажите, как это сделать? Сама программа...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
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
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru