|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Мар 21, 2004 18:26:15 Так получилось, что мне в инсте задали написать прогу на assembler(e) Задание следующее..."Работа с большими объемами памяти" необходимо перейти в защащенный режим....Зпаолнить таблицу GDT...создать 4 массива 4 массива с разными уровнями приоритета ( от 0 до 3), причем обращение к массивам зависит от уровня приоритета..например: к массиву с 3 уровнем приоритета могут обращаться массивы с 0, 1 и 2 уровнями...к массиву со 2 уровнем приоритета обращаются массивы с 0 и 1..и так далее. буду очень благодарна если мне кто-нить поможет....заранее всем СПАСИБО |
|
|
Дата: Мар 22, 2004 00:00:28 Чем смогу попробую помочь. Я использую ассемблер FASM. Поэтому я буду использовать его синтаксис. До перехода в защищенный режим нужно создать таблицу GDT в памяти (GDT - Global Descriptor Table - Глобальная Дескрипторная Таблица). После этого надо загрузить регистр GDTR (Global Descriptor Table Register) значениями размера таблицы и адресом памяти по которому расположена эта таблица. Потом надо запретить прерывания (это важный шаг, так как если не дай бог в защищенном режиме у тебя придет прерывание от таймера, то у тебя все повиснет, так как таблица IDT не инициализирована) и перейти в защищенный режим. В защищенном режиме пишешь в сегментный регистр DS (или ES или FS или GS) селектор и потом можешь обращаться к памяти примерно так: mov ax,[ds:123456h]. После того как все что надо выполнено можешь выйти из защищенного режима и завершить программу. Для сказанного приведу код с пояснениями скомпилирован он будет в COM-программу: org 100h ; PSP для COM-программ xor eax,eax ; обнуляем eax xor ebx,ebx ;обнуляем ebx mov ax,cs ; пишем CS, равный DS (у нас COM-программа) shl eax,4 ; умножаем на 16 mov bx,null ; пишем в bx смещение начала таблицы GDT add eax,ebx ; пишем в eax сумму eax и ebx. Теперь в eax у нас полный физический адрес начала таблицы GDT. mov [cs:gdtr+2],eax ; сохранили это значение в памяти, потом оно будет записано в регистр GDTR. lgdt [cs:gdtr] ; загружаем регистр GDTR cli ; запрещаем прерывания (важно!!!) smsw ax ; сохраняем регистр MSW (Machine Status Word) в ax or al,1 ; устанавливаем бит PE (Protection Enable) lmsw ax ; загружаем регистр MSW, после выполнения этой инструкции процессор переходит в защищенный режим. Приведенный выше код будет работать и на процессоре 80286. Так как MSW - это 16 младших битов регистра CR0, то этот код можно заменить на следующий: mov eax,cr0 or al,1 mov cr0,eax. Однако этот код уже не будет работать на 80286, так как регистр CR0 появился только в 80386 процессоре. Ладно, теперь что надо делать в защищенном режиме: mov ax,8 ; 8=селектор сегмента данных для DS mov ds,ax ; пишем селектор в регистр DS ; потом работаешь с памятью как от тебя ;требует задание. Например что-то типа этого: mov eax,[ds:123456h] mov ebx,200000h mov [ds:ebx],eax ; и.т.д и.т.п ; после этого можешь выйти из защищенного режима. Для этого надо, чтобы программа выполнялась на 80386 процессоре или выше (я думаю, что у тебя это условие выполняется). Делается это очисткой бита PE в регистре CR0 вот так: mov eax,cr0 ; Пишем из регитра CR0 в регистр ax and al,0feh ; обнуляем бит PE mov cr0,eax ; Пишем обратно. После выполнения этой инструкции бит PE сброшен и процессор переходит обратно в режим реальной адресации (реальный режим). int 20h ; завершаем программу (Прерывание 20h в DOS предназначено для завершения программ) ; Далее в программе область данных с таблицами: gdtr: dw 63 ; 6 байт отсюда пойдут в GDTR (dw и dd) ; 63=8*8-1 => 8 элементов GDT dd 0 ; сюда программа напишет адрес начала таблицы GDT в памяти null: db 0,0,0,0,0,0,0,0 ; нулевой элемент GDT (обязательно должен быть) data_segment: db 0ffh,0ffh,00h,00h,00h,92h,8fh,00h ; элемент GDT для сегмента данных 92h=сегмент данных с 0 уровнем привелегий, 8fh- установлен бит гранулярности (7-ой). Размер сегмента=(0fffffh+1)*4096=4Гбайт (2**32 байт). Далее ставишь еще элементы таблицы GDT по своему вкусу. Если они будут отличаться только по привилегированности, то у них будет отличаться только байт 92h (вместо него будет другой). Вроде набросал тут наспех пример программы, разбирайся, почитай про форматы всяких таблиц в защищенном режиме, так как приводить здесь эти описания слишком долго. |
|
|
Дата: Мар 22, 2004 17:31:33 Icebp Спасибо тебе большое.....это будет работать под Tasm???? С тобой как-нибудь можно связаться??? |
|
|
Дата: Мар 24, 2004 18:11:58 Извиняюсь за то, что отвечаю через два дня, связано это с тем, что я сейчас нечасто выхожу в интернет, так что возможны 2-х дневные перерывы. Насчет Tasm-a я думаю надо будет переделать начало и конец файла, а сами инструкции программы конечно же останутся без изменений. При этом вначале надо будет добавить что то типа: segment para code, но так как я на Tasm не пишу, поэтому конкретно я не могу сказать. Если тебе неважно на каком диалекте ассемблера будет написана программа, то я тебе советую FASM, так как он гораздо проще и удобнее. Скачать FASM можешь на сайте: http://flatassembler.net из раздела download. Связаться со мной можно по e-mail: icebp@hotmail.ru |