Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
3 / 8 / 1
Регистрация: 12.07.2009
Сообщений: 361
1

Разработать таблицу LDT, содержащую дескрипторы сегментов с параметрами

21.09.2012, 17:33. Показов 3571. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
I. Разработать таблицу LDT, содержащую дескрипторы сегментов с параметрами, указанными в индивидуальном задании.
II. Разработать таблицу GDT, содержащую дескрипторы следующих сегментов:
сегментов кода, стека, данных, которые имеют те же параметры, что и в реальном режиме;
сегмента видеопамяти размером в один экран;
сегмента таблицы LDT.
Программное формирование и вывод на экран содержимого таблиц GDT и LDT.
Примечание:
а) Если в задании не указан базовый адрес сегмента, то в ка¬честве его базового адреса использовать базовый адрес сегмента в ре-альном режиме, равный содержимому соответствующего сегмента, умноженному на 16.
б) Если в задании не указан уровень привилегий сегмента, то считать его равным 3.
в) Для дескриптора таблицы LDT поля байта доступа имеют следующее значение: P=1; DPL=0; S=0; TYPE=2

индивидуальное задание
Сегмент кода - объем 32 Кбайт с запретом чтения;
сегмент стека - объем 30 Кбайт;
сегмент данных - объем 16 Кбайт с защитой от записи;
сегмент данных - объем 92 Мбайт, базовый адрес - 1 Мбайт.


Подскажите пожалуйста какая программа(ассемблер) сможет скомпилировать данное сделанное задание(сверху которое я сделаю)? И отладчик к нему тоже.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.09.2012, 17:33
Ответы с готовыми решениями:

Разработать модуль подкачки с визуализацией процесса подкачки страниц или сегментов
Всем доброго времени суток! я уже полмесяца не могу разобраться с этой задачей, может кто-нибудь в...

Разработать HTML страницу, содержащую меню с указателем
Помогите, Разработать HTML страницу, содержащую меню с указателем. Количество пунктов 5. При выборе...

Разработать структуру с именем ZNAK, содержащую поля
Разработать структуру с именем ZNAK, содержащую поля: • Фамилия, имя; • Знак Зодиака; • Дата...

Создать таблицу, содержащую сведения
Ребята помогите!!! А. Создать таблицу, содержащую сведения об ассортименте обуви в магазине фирмы....

10
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,927
22.09.2012, 08:47 2
Ассемблер любой. В задании сказано сформировать таблицу, не сказано что нужно переходить в защищенный режим, следовательно отладчик не понадобится.
З.Ы. Дочитался, что нужно вывести на экран, тогда отладчик тоже любой. Можно использовать TASM/Turbo Debugger.
0
3 / 8 / 1
Регистрация: 12.07.2009
Сообщений: 361
22.09.2012, 08:58  [ТС] 3
Цитата Сообщение от alexcoder Посмотреть сообщение
Ассемблер любой. В задании сказано сформировать таблицу, не сказано что нужно переходить в защищенный режим, следовательно отладчик не понадобится.
З.Ы. Дочитался, что нужно вывести на экран, тогда отладчик тоже любой. Можно использовать TASM/Turbo Debugger.
Мне в лекции сказано что надо обязательно переходить в защищенный режим тогда какая программа сможет скомпилировать?
0
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,927
22.09.2012, 09:06 4
Скомпилировать любой может, а вот с защищенным режимом в таком случае ни один отладчик не справится, все нужно представлять в голове и отлаживать на бумажке!
По слухам, можно отлаживать в виртуальной машине BOCHS.
2
3 / 8 / 1
Регистрация: 12.07.2009
Сообщений: 361
22.09.2012, 09:26  [ТС] 5
Цитата Сообщение от alexcoder Посмотреть сообщение
Ассемблер любой. В задании сказано сформировать таблицу, не сказано что нужно переходить в защищенный режим, следовательно отладчик не понадобится.
З.Ы. Дочитался, что нужно вывести на экран, тогда отладчик тоже любой. Можно использовать TASM/Turbo Debugger.
В дескрипторе сегмента есть же биты R и W и их в защищенном режиме нужно задавать. Как это сделать без защищенного режима?
0
Клюг
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
22.09.2012, 11:09 6
Гуглите unreal mode.

А вообще-то задачка решаема через DPMI-host API. Убогий виндовый в том числе.
DPMI 1.0 Programming API Specfication
Примерчик, отлаживал под Debugх.
1
539 / 399 / 99
Регистрация: 18.08.2012
Сообщений: 1,024
23.09.2012, 15:40 7
Цитата Сообщение от ElvenDragon Посмотреть сообщение
В дескрипторе сегмента есть же биты R и W и их в защищенном режиме нужно задавать. Как это сделать без защищенного режима?
Советую зайти на WASM.RU. Там есть статьи о защищенном режиме. Вариант с DPMI, скорее всего, не годится. Здесь речь идет о полностью самостоятельном переходе в РМ. Замечу, что перед созданием LDT надо создать GDT, в которой LDT будет описана с помощью системного дескриптора. Битов W, R как таковых нет. Эти свойства сегментов задаются в одном из байтов атрибутов дескриптора. Все таблицы с рассчитанными базовыми адресами и лимитами должны быть подготовлены еще до того кода, с которого начался данный пост.

Добавлено через 20 часов 30 минут
Еще есть хорошая книга в четырех частях: Рудаков П.И.,Финогенов К.Г.Программируем на языке ассемблера IBM PC. Если, конечно, удастся найти
1
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,113
Записей в блоге: 2
23.09.2012, 16:25 8
Нужно будет эту LDT еще применить (иначе зачем она делается).
Переходить в PM придется обязательно, и делать это придется например под DOS'ом на виртуальной машине.
Советую книгу Аблязов Р.З. "Программирование на ассемблере на платформе х86_86". Не смотря на название в книге так же описан процесс перехода в PM. Так же имеются уже готовые исходники перехода в PM из real mode и пример работы с LDT. Там примеры правда на fasm'e, но это masm совместимый компилятор, так что с переводом проблем не будет.
1
391 / 179 / 2
Регистрация: 14.03.2012
Сообщений: 443
23.09.2012, 18:00 9
Цитата Сообщение от Dmitrinik Посмотреть сообщение
Еще есть хорошая книга в четырех частях: Рудаков П.И.,Финогенов К.Г.Программируем на языке ассемблера IBM PC. Если, конечно, удастся найти
Можно кстати "Язык ассемблера: уроки программирования - Рудаков П.И" взять. В прикреплённой теме имеется.
0
202 / 168 / 11
Регистрация: 30.05.2012
Сообщений: 703
25.09.2012, 18:32 10
Цитата Сообщение от Dmitrinik Посмотреть сообщение
Советую зайти на WASM.RU.
Правильно. Там целый цикл статей. Немного занудная теория до 7ой, а дальше рабочий исходник выхода в реальный режим. Одну из статей приведу. Правда там говорится о Global таблице, но с LDT то же сааааааааамое:
аблица дескрипторов

Итак, к чему мы пришли: оказывается, сегменты не раскиданы по памяти как попало и непонятно где, теперь мы с уверенностью можем сказать где какой из сегментов начинается, где заканчивается, что это за сегмент (код, данные или стек), вся эта информация хранится в ДЕСКРИПТОРЕ. Казалось бы, чего нам не хватает для полного счастья? Все же вроде ясно и понятно и не о чем здесь больше говорить! Однако, есть еще кое что… Один вопрос, который уже должен был загореться в твоем подсознании… ГДЕ ЖЕ НАХОДИТСЯ САМ ДЕСКРИПТОР ???!!!

Находиться он может в трех местах:

* Глобальная таблица дескрипторов (GDT - Global Descriptor Table)
* Локальная таблица дескрипторов (LDT - Local Descriptor Table)
* Таблица дескрипторов прерываний (IDT – Interrupt Descriptor Table)

Эти таблицы находятся в оперативной памяти (там же, где и собственно сами программы), а не в процессоре, жестком диске или куда еще могут завести тебя фантазии… Поэтому, очевидно, что строить ТАБЛИЦЫ ДЕСКРИПТОРОВ придется «руками», нам самим. И вообще, с этого момента пора привыкать – в защищенном режиме ВСЕ НУЖНО СТРОИТЬ САМОМУ. В этом и заключается сила!

Несколько слов по поводу первых двух таблиц (на третьей (IDT) мы остановимся в главе посвященной прерываниям в защищенном режиме).

Глобальная таблица дескрипторов (GDT):

ЗАПОМНИ: КАЖДАЯ ОС ДОЛЖНА ИМЕТЬ ОДНУ ТАБЛИЦУ GDT!!! Без нее – никуда! Ей (таблицей) могут пользоваться ВСЕ (!) программы и задачи системы. Что значит «пользоваться таблицей дескрипторов»? Это значит, хранить в ней СВОЙ дескриптор.

Таблица GDT – сама по себе НЕ СЕГМЕНТ! Это структура данных в линейном адресном пространстве (в памяти). НАЧАЛО таблицы GDT храниться В РЕГИСТРЕ GDTR! Регистр GDTR – это самый обыкновенный регистр, такой же обыкновенный, как EAX, EIP, ES, только вот его функция заключается не в хранении каких-то промежуточных данных, а в хранении фиксированного числа – НАЧАЛА ТАБЛИЦЫ GDT. Называние регистра GDTR запомнить очень легко: GDT – это таблица, R – регистр. Не правда ли, пока все просто? )

Да, кстати, не упусти важный момент: мы должны сделать все так, чтобы начало таблицы GDT в памяти было кратно 8. Это связано с архитектурой и так проц быстрее соображает при обращении к таблице.

GDTR:

32-битный линейный базовый адрес|16-битный лимит таблицы

Вот он, регистр GDTR. Весит 48 бит. Как видишь, он содержит не только адрес начала таблицы GDT в памяти, а еще и ее лимит. Лимит таблицы – 16-битное значение, показывает величину таблицы в байтах + 1. (т.е. все как и в случае с лимитом сегмента: если лимит таблицы в GDTR равен 0, то на самом деле это означает что реально (в памяти) лимит равен одному байту).

Как ты уже знаешь, сегментный дескриптор ВСЕГДА занимает 8 байт (2 двойных слова). Если уже забыл – посмотри на картинку из 2 выпуска. Следовательно, лимит таблицы дескрипторов – величина, равная 8N-1 байт. Но и N – тоже не резиновая величина. Скоро узнаешь каков предел этого самого N (т.е. сколько всего дескрипторов может содержать таблица)

Первый дескриптор в GDT не используется и называется «нулевой дескриптор» (null descriptor). При обращении к памяти через этот дескриптор возникает уже знакомая нам «рука правосудия» с #GP, и все опять вынуждены пасть ниц

Поэтому первый дескриптор в GDT – РУКАМИ НЕ ТРОГАТЬ!

Загрузить/считать значение регистра GDTR можно командами LGDT/SGDT. По умолчанию (т.е. после нажатия на кнопку Reset или включения компа) база GDT равна нулю, а лимит – FFFFh, т.е. фактически по умолчанию выделено максимум места, под FFFFh/8 = 8191 дескрипторов (ну минус один, учитывая null descriptor).

Локальная таблица дескрипторов (LDT):

В отличии от GDT совершенно не ОБЯЗАНА присутствовать вообще. И в то же самое время, ПО ЖЕЛАНИЮ, их можно развести великое множество (GDT ДОЛЖНА БЫТЬ только одна). Каждая задача может иметь свою собственную LDT, в то же время несколько задач могут использовать одну LDT на всех.

LDT – это СЕГМНЕТ! (GDT – структура данных). Это принципиально! И вот почему: т.к. LDT – это сегмент, то значит у нее тоже есть свой дескриптор! И где бы вы думали? Да все в той же GDT!!! Да да, звучит несколько странновато – у таблицы дескрипторов есть свой дескриптор!! Но, то ли еще будет!

Так же, как и у GDT у LDT тоже есть свой регистр – LDTR. В отличии от GDTR этот регистр, помимо инфы про базу и лимит LDT, содержит еще одно поле – сегментный селектор. Пока что не вникай, просто запомни слово – СЕЛЕКТОР.

LDTR:

Сегм. Селектор (16 бит)
32-битный линейный базовый адрес
16-битный лимит сегмента

Инструкции LLDT и SLDT позволяют писать/читать регистр LDTR. Точно так же, при reset-е значение базы в LDTR падает в ноль, а лимит – в FFFFh.

Ну и напоследок - ВНИМАНИЕ! КОНКУРС!!! )

Перед тобой пример структуры, которая являет собой таблицу GDT (вместо ИКС-ов значения, которые мы еще не рассматривали, поэтому не смотри на них); Тебе предстоит найти РЕАЛЬНЫЕ ЗНАЧЕНИЯ базы и лимита для каждого из описуемых семи сегментов (именно линейные адреса в памяти). Для одного из них дана подсказка в комментарии. Победителей ожидают ценные призы, а того, кто первым пришлет ответ – КВАРТИРА В МОСКВЕ! Поторопитесь!!!

Чтобы было проще – открой картинку с дескриптором и смотри одним глазом на нее, другим - на значения. Да, и помни: смотреть картинку нужно «задом-наперед» (т.е. сначала младшие байты, потом старшие):

GDT:
; нулевой дескриптор (ОБЯЗАТЕЛЬНО ДОЛЖЕН ПРИСУТСВОВАТЬ, НО РУКАМИ НЕ ТРОГАТЬ!)
0. db 8 dup (0)

; Сегмент с базой в 0 и лимитом в 1235h (не забывай про +1 к лимиту!)
; Линейный адрес базы = 0, линейный адрес лимита = 0 + 1235h = 1235h
1. Descr_code db 34h,12h,00h,00h,00h,XXh,0X000000b,00h

2. Descr_data db 0C8h,0Dh,36h,12h,00h,XXh,0X100000b,00h
3. Descr_stack db 0FFh,00h,00h,20h,00h,XXh,1X000000b,00h
4. Descr_code2 db 0DEh,0BCh,01h,20h,10h,XXh,0X001010b,00h
5. Descr_data2 db 00h,00h,00h,00h,00h,XXh,0X000000b,10h
6. Descr_stack2 db 01h,00h,10h,00h,00h,XXh,0X000001b,10h
7. Descr_LDT db 04h,00h,00h,00h,00h,XXh,1X000000b,20h

GDT_limit = $-GDT

GDTR dw GDT_limit-1
dd ?

Дополнительные задания:

1. Найди ошибку! Один из дескрипторов содержит ОШИБКУ!
2. Покажи, как правильно нужно загрузить регистр GDTR.

Ответы присылать сюда: brokensword@ukr.net в таком виде

1. Линейный адрес базы = 0
Линейный адрес лимита = 1235h
2. . . .

Слово «линейный адрес» можешь опустить
0
202 / 168 / 11
Регистрация: 30.05.2012
Сообщений: 703
25.09.2012, 18:32 11
Цитата Сообщение от Dmitrinik Посмотреть сообщение
Советую зайти на WASM.RU.
Правильно. Там целый цикл статей. Немного занудная теория до 7ой, а дальше рабочий исходник выхода в реальный режим. Одну из статей приведу. Правда там говорится о Global таблице, но с LDT то же сааааааааамое:
аблица дескрипторов

Итак, к чему мы пришли: оказывается, сегменты не раскиданы по памяти как попало и непонятно где, теперь мы с уверенностью можем сказать где какой из сегментов начинается, где заканчивается, что это за сегмент (код, данные или стек), вся эта информация хранится в ДЕСКРИПТОРЕ. Казалось бы, чего нам не хватает для полного счастья? Все же вроде ясно и понятно и не о чем здесь больше говорить! Однако, есть еще кое что… Один вопрос, который уже должен был загореться в твоем подсознании… ГДЕ ЖЕ НАХОДИТСЯ САМ ДЕСКРИПТОР ???!!!

Находиться он может в трех местах:

* Глобальная таблица дескрипторов (GDT - Global Descriptor Table)
* Локальная таблица дескрипторов (LDT - Local Descriptor Table)
* Таблица дескрипторов прерываний (IDT – Interrupt Descriptor Table)

Эти таблицы находятся в оперативной памяти (там же, где и собственно сами программы), а не в процессоре, жестком диске или куда еще могут завести тебя фантазии… Поэтому, очевидно, что строить ТАБЛИЦЫ ДЕСКРИПТОРОВ придется «руками», нам самим. И вообще, с этого момента пора привыкать – в защищенном режиме ВСЕ НУЖНО СТРОИТЬ САМОМУ. В этом и заключается сила!

Несколько слов по поводу первых двух таблиц (на третьей (IDT) мы остановимся в главе посвященной прерываниям в защищенном режиме).

Глобальная таблица дескрипторов (GDT):

ЗАПОМНИ: КАЖДАЯ ОС ДОЛЖНА ИМЕТЬ ОДНУ ТАБЛИЦУ GDT!!! Без нее – никуда! Ей (таблицей) могут пользоваться ВСЕ (!) программы и задачи системы. Что значит «пользоваться таблицей дескрипторов»? Это значит, хранить в ней СВОЙ дескриптор.

Таблица GDT – сама по себе НЕ СЕГМЕНТ! Это структура данных в линейном адресном пространстве (в памяти). НАЧАЛО таблицы GDT храниться В РЕГИСТРЕ GDTR! Регистр GDTR – это самый обыкновенный регистр, такой же обыкновенный, как EAX, EIP, ES, только вот его функция заключается не в хранении каких-то промежуточных данных, а в хранении фиксированного числа – НАЧАЛА ТАБЛИЦЫ GDT. Называние регистра GDTR запомнить очень легко: GDT – это таблица, R – регистр. Не правда ли, пока все просто? )

Да, кстати, не упусти важный момент: мы должны сделать все так, чтобы начало таблицы GDT в памяти было кратно 8. Это связано с архитектурой и так проц быстрее соображает при обращении к таблице.

GDTR:

32-битный линейный базовый адрес|16-битный лимит таблицы

Вот он, регистр GDTR. Весит 48 бит. Как видишь, он содержит не только адрес начала таблицы GDT в памяти, а еще и ее лимит. Лимит таблицы – 16-битное значение, показывает величину таблицы в байтах + 1. (т.е. все как и в случае с лимитом сегмента: если лимит таблицы в GDTR равен 0, то на самом деле это означает что реально (в памяти) лимит равен одному байту).

Как ты уже знаешь, сегментный дескриптор ВСЕГДА занимает 8 байт (2 двойных слова). Если уже забыл – посмотри на картинку из 2 выпуска. Следовательно, лимит таблицы дескрипторов – величина, равная 8N-1 байт. Но и N – тоже не резиновая величина. Скоро узнаешь каков предел этого самого N (т.е. сколько всего дескрипторов может содержать таблица)

Первый дескриптор в GDT не используется и называется «нулевой дескриптор» (null descriptor). При обращении к памяти через этот дескриптор возникает уже знакомая нам «рука правосудия» с #GP, и все опять вынуждены пасть ниц

Поэтому первый дескриптор в GDT – РУКАМИ НЕ ТРОГАТЬ!

Загрузить/считать значение регистра GDTR можно командами LGDT/SGDT. По умолчанию (т.е. после нажатия на кнопку Reset или включения компа) база GDT равна нулю, а лимит – FFFFh, т.е. фактически по умолчанию выделено максимум места, под FFFFh/8 = 8191 дескрипторов (ну минус один, учитывая null descriptor).

Локальная таблица дескрипторов (LDT):

В отличии от GDT совершенно не ОБЯЗАНА присутствовать вообще. И в то же самое время, ПО ЖЕЛАНИЮ, их можно развести великое множество (GDT ДОЛЖНА БЫТЬ только одна). Каждая задача может иметь свою собственную LDT, в то же время несколько задач могут использовать одну LDT на всех.

LDT – это СЕГМНЕТ! (GDT – структура данных). Это принципиально! И вот почему: т.к. LDT – это сегмент, то значит у нее тоже есть свой дескриптор! И где бы вы думали? Да все в той же GDT!!! Да да, звучит несколько странновато – у таблицы дескрипторов есть свой дескриптор!! Но, то ли еще будет!

Так же, как и у GDT у LDT тоже есть свой регистр – LDTR. В отличии от GDTR этот регистр, помимо инфы про базу и лимит LDT, содержит еще одно поле – сегментный селектор. Пока что не вникай, просто запомни слово – СЕЛЕКТОР.

LDTR:

Сегм. Селектор (16 бит)
32-битный линейный базовый адрес
16-битный лимит сегмента

Инструкции LLDT и SLDT позволяют писать/читать регистр LDTR. Точно так же, при reset-е значение базы в LDTR падает в ноль, а лимит – в FFFFh.

Ну и напоследок - ВНИМАНИЕ! КОНКУРС!!! )

Перед тобой пример структуры, которая являет собой таблицу GDT (вместо ИКС-ов значения, которые мы еще не рассматривали, поэтому не смотри на них); Тебе предстоит найти РЕАЛЬНЫЕ ЗНАЧЕНИЯ базы и лимита для каждого из описуемых семи сегментов (именно линейные адреса в памяти). Для одного из них дана подсказка в комментарии. Победителей ожидают ценные призы, а того, кто первым пришлет ответ – КВАРТИРА В МОСКВЕ! Поторопитесь!!!

Чтобы было проще – открой картинку с дескриптором и смотри одним глазом на нее, другим - на значения. Да, и помни: смотреть картинку нужно «задом-наперед» (т.е. сначала младшие байты, потом старшие):

GDT:
; нулевой дескриптор (ОБЯЗАТЕЛЬНО ДОЛЖЕН ПРИСУТСВОВАТЬ, НО РУКАМИ НЕ ТРОГАТЬ!)
0. db 8 dup (0)

; Сегмент с базой в 0 и лимитом в 1235h (не забывай про +1 к лимиту!)
; Линейный адрес базы = 0, линейный адрес лимита = 0 + 1235h = 1235h
1. Descr_code db 34h,12h,00h,00h,00h,XXh,0X000000b,00h

2. Descr_data db 0C8h,0Dh,36h,12h,00h,XXh,0X100000b,00h
3. Descr_stack db 0FFh,00h,00h,20h,00h,XXh,1X000000b,00h
4. Descr_code2 db 0DEh,0BCh,01h,20h,10h,XXh,0X001010b,00h
5. Descr_data2 db 00h,00h,00h,00h,00h,XXh,0X000000b,10h
6. Descr_stack2 db 01h,00h,10h,00h,00h,XXh,0X000001b,10h
7. Descr_LDT db 04h,00h,00h,00h,00h,XXh,1X000000b,20h

GDT_limit = $-GDT

GDTR dw GDT_limit-1
dd ?

Дополнительные задания:

1. Найди ошибку! Один из дескрипторов содержит ОШИБКУ!
2. Покажи, как правильно нужно загрузить регистр GDTR.

Ответы присылать сюда: brokensword@ukr.net в таком виде

1. Линейный адрес базы = 0
Линейный адрес лимита = 1235h
2. . . .

Слово «линейный адрес» можешь опустить
0
25.09.2012, 18:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.09.2012, 18:32
Помогаю со студенческими работами здесь

Разработать программу содержащую 3 вида циклических управляющих структутр
Используя технологию структурного программирования разработать программу решения индивидуальной...

Разработать структуру записи содержащую информацию о сотрудниках предприятия
Разработать структуру записи содержащую информацию о сотрудниках предприятия. Вывести информацию о...

Разработать программу, содержащую 2 функции для работы с текстовыми файлами
1)Задать имя файла: ввод с клавиатуры; строковая константа в программе. 2)Вариант цепочки...

Сформировать таблицу, содержащую длины опор крыши
Сечение крыши имеет форму полукруга с радиусом R м. Сформировать таблицу, содержащую длины опор,...


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

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