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

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

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

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

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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.12.2010, 01:41
Ответы с готовыми решениями:

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

защищенный режим
люди разъясните кто знает.надо переключить проц в защищенный режим работы. часть кода code...

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

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

11
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
01.12.2010, 04:51 2
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  [ТС] 3
Зевок с GDI исправил Но количество ошибок как ни странно увеличилось. Что делать с командой перехода на ТАСМе тоже пока вопрос.
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
01.12.2010, 11:40 4
Цитата Сообщение от Dandula Посмотреть сообщение
Что делать с командой перехода на ТАСМе тоже пока вопрос
это вы о чем? Если о
Цитата Сообщение от Dandula Посмотреть сообщение
**Error** pm1.asm(47) Relative jump out of range by 0004h bytes
просто уберите short. У меня во всяком случае все скомпилировалось без ошибок. На счет правильности работы не знаю, не проверял
1
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
01.12.2010, 11:49 5
Dandula, так покажи исправленный текст и строки с ошибками
0
0 / 0 / 0
Регистрация: 28.06.2009
Сообщений: 7
01.12.2010, 12:05  [ТС] 6
Прошу прощения - не вводил ключ при компиляции. Еще один момет - как убрать русские символы из 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 7
Dandula, ты видимо не понял, там в командах часть букв написана по русски, часть по английски(у меня копи/паст Зубкова дает тот же результат, видимо сканировали и так распозналось). Просто перепиши строки на которые указывает компилятор заново
1
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
01.12.2010, 12:31 8
Цитата Сообщение от Dandula
как убрать русские символы из eax?
И после этого пытаться писать программы по переходу в защищенный режим и работе с сегментами. А не рано?
1
0 / 0 / 0
Регистрация: 28.06.2009
Сообщений: 7
01.12.2010, 12:35  [ТС] 9
Всем сасибо за помощь! На этот раз все нормально скомпилилось.
P.S. Первоначаьно еще исправлял в Far с плагином Colorer и в командах с кириллицей исправлял операнды не с тем цветом подсветки - вот и возникла гупая ситуация.
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
01.12.2010, 12:46 10
Dandula, так в Far'e сразу видно, что это не регистр а переменная
Вложения
Тип файла: rar temp.rar (53.7 Кб, 34 просмотров)
0
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
01.12.2010, 13:18 11
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 12
Цитата Сообщение от Mikl___ Посмотреть сообщение
5) Broken Sword цикл статей "Процессор Intel в защищенном режиме" на сайте WASM.RU
рекомендую начать с этой. Сам оттуда начинал когда то - проще объяснять наверно невозможно.
Ну и можно добавить к этому списку intel manuals - по английски, зато наиболее полно и из первоисточника
0
01.12.2010, 13:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.12.2010, 13:32
Помогаю со студенческими работами здесь

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

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

Связь сегментных регистров с сегментами
При написании *.com програм адреса в сегментные регистры заносятся директивой assume assume...

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru