Доброго времени суток. Возник у меня вопрос: какая же модель памяти будет использована? И как повлиять на этот выбор. В http://flatassembler.net/docs.php?article=manual прямого ответа не нашел (или же не понял), в http://board.flatassembler.net/topic.php?p=91768#91768 в 27 пункте было что-то, но ничего подробного (( Вопрос возник давно, но сейчас ответ понадобился. А суть проблемы в том, что я работал с ассемблером (не долго, но чтобы привыкнуть к fasm времени хватило) в linux. В ВУЗе начались лабораторные работы. Дос )) _______________________________ "Никогда ничего не делайте в первый раз".
ntfs_ok Вопрос примерно похож на следующий: "Я пишу программу, которая выводит строку. Какая строка будет использована?" Модель памяти — это способ расположения кода и данных в сегментах. Сегменты задаются директивой segment. Как Вы их определите, такая модель и будет. Определите код и данные в одном сегменте, будет tiny, определите в разных, будет small, определите несколько сегментов для кода, будет medium и т.д. Этот пункт не имеет никакого отношения к моделям памяти. Он описывает один побочный режим работы x86.
Благодарю. Примерно так я и подозревал )) (27 пункт указал, поскольку не понял что в нем))) А вы не могли бы дать пример, где не только вызов кода из другого сегмента, а еще и доступ к нему. И еще последний вопрос. А в регистры процессора какие куда сегменты будут занесены в самом начале? А то я тоже что-то не нашел (во всяком случае пока не нашел) PS http://board.flatassembler.net/topic.php?t=11767 - ответ на мой первый вопрос. нашел уже потом
ntfs_ok Что значит "доступ к коду сегмента"? Если имеется в виду чтение/запись памяти, то по умолчанию она производится через ds (стековый доступ вида push/pop через ss, разумеется). Поэтому какую базу он содержит, в тот сегмент и будет доступ. Хотите доступ к другому сегменту, меняйте базу в ds. Либо посредством доступа через другой сегментный регистр, поставив префикс переопределения, в духе: mov ax, [es:bx]. Стартовые значения cs и ss есть в MZ-заголовке. ds (возможно и es, не помню) указывает на PSP, поэтому многие программы под DOS начинаются с инструкций mov ax,@data + mov ds,ax .
Да, и ds и es на PSP ссылаются. (судя по TD) А по количество сегметнов не лимитировано? (ну если они все уберутся в памяти) Прошу прощения за сумбурное выражение мыслей)) Благодарю за помощь )
ntfs_ok Формально максимальное количество сегментов не связано с тем, кто нагадил в памяти. Оно ограничено размером и интерпретацией значений сегментных регистров. Для реального режима это 16 бит и соответственно 2^16 (16 - разрядность сегментых регистров) расположенных каждые 16 байт (16 - множитель значения в сегментном регистре для получения линейного адреса) и частично перекрывающихся сегментов по 2^16 (16 - разрядность смещения, как части логического адреса) байт каждый. Для защищённого можно и похоливарить немного, т.к. формально для выбора дескриптора сегмента в одной из двух таблиц дескрипторов (LDT и GDT) используются 14 старших бит селектора сегмента (который можно положить в сегментный регистр), что позволяет напихать таблицы дескрипторами для 2^14 различных сегментов. Но (!) что мешает хранить дополнительные дескрипторы где-нибудь ещё, а в нужный момент втыкать их в таблицы дескрипторов? Правильно ли считать, что, исходя из этих рассуждений, максимальное число сегментов ещё больше?
l_inc Исходя из ваших рассуждений и не очень сложных знаний комбинаторики можно утверждать, что для защищенного режима возможно составить лишь 2^63 дескрипторов сегментов (не считая системных), но зачем нам столько с вводом страничного преобразования.
max7C4 Страницы и сегменты это две совершенно параллельные сущности, решающие совершенно разные задачи и никак друг на друга не влияющие. Имхо сегменты были суперактуальны для решения проблемы 64к в 16-битной архитектуре. После того как сегменты стали "разумного" размера актуальность иметь их в большом количестве полностью исчезла, что собственно подтверждается популярностью flat модели памяти . Но если для какой-то очень экзотической цели нужно их очень много, то l_inc прав - в IA32 это возможно путём динамической подмены локальных таблиц и тогда никаких ограничений на их количество нет. Хотя не представляю зачем оно может понадобиться .