1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

fasm dos модель памяти

Тема в разделе "WASM.BEGINNERS", создана пользователем ntfs_ok, 12 фев 2011.

  1. ntfs_ok

    ntfs_ok Primus

    Публикаций:
    0
    Регистрация:
    5 ноя 2010
    Сообщения:
    3
    Адрес:
    Город, стоящий у солнца
    Доброго времени суток.
    Возник у меня вопрос: какая же модель памяти будет использована? И как повлиять на этот выбор. В http://flatassembler.net/docs.php?article=manual прямого ответа не нашел (или же не понял), в http://board.flatassembler.net/topic.php?p=91768#91768 в 27 пункте было что-то, но ничего подробного ((

    Вопрос возник давно, но сейчас ответ понадобился.
    А суть проблемы в том, что я работал с ассемблером (не долго, но чтобы привыкнуть к fasm времени хватило) в linux. В ВУЗе начались лабораторные работы. Дос ))

    _______________________________
    "Никогда ничего не делайте в первый раз".
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    ntfs_ok
    Вопрос примерно похож на следующий: "Я пишу программу, которая выводит строку. Какая строка будет использована?"
    Модель памяти — это способ расположения кода и данных в сегментах. Сегменты задаются директивой segment. Как Вы их определите, такая модель и будет. Определите код и данные в одном сегменте, будет tiny, определите в разных, будет small, определите несколько сегментов для кода, будет medium и т.д.

    Этот пункт не имеет никакого отношения к моделям памяти. Он описывает один побочный режим работы x86.
     
  3. ntfs_ok

    ntfs_ok Primus

    Публикаций:
    0
    Регистрация:
    5 ноя 2010
    Сообщения:
    3
    Адрес:
    Город, стоящий у солнца
    Благодарю. Примерно так я и подозревал )) (27 пункт указал, поскольку не понял что в нем)))
    А вы не могли бы дать пример, где не только вызов кода из другого сегмента, а еще и доступ к нему.
    И еще последний вопрос. А в регистры процессора какие куда сегменты будут занесены в самом начале? А то я тоже что-то не нашел (во всяком случае пока не нашел)

    PS http://board.flatassembler.net/topic.php?t=11767 - ответ на мой первый вопрос. нашел уже потом
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    ntfs_ok
    Что значит "доступ к коду сегмента"? Если имеется в виду чтение/запись памяти, то по умолчанию она производится через ds (стековый доступ вида push/pop через ss, разумеется). Поэтому какую базу он содержит, в тот сегмент и будет доступ. Хотите доступ к другому сегменту, меняйте базу в ds. Либо посредством доступа через другой сегментный регистр, поставив префикс переопределения, в духе: mov ax, [es:bx].
    Стартовые значения cs и ss есть в MZ-заголовке. ds (возможно и es, не помню) указывает на PSP, поэтому многие программы под DOS начинаются с инструкций mov ax,@data + mov ds,ax .
     
  5. ntfs_ok

    ntfs_ok Primus

    Публикаций:
    0
    Регистрация:
    5 ноя 2010
    Сообщения:
    3
    Адрес:
    Город, стоящий у солнца
    Да, и ds и es на PSP ссылаются. (судя по TD)
    А по количество сегметнов не лимитировано? (ну если они все уберутся в памяти)
    Прошу прощения за сумбурное выражение мыслей))
    Благодарю за помощь )
     
  6. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    ntfs_ok
    Формально максимальное количество сегментов не связано с тем, кто нагадил в памяти. Оно ограничено размером и интерпретацией значений сегментных регистров.
    Для реального режима это 16 бит и соответственно 2^16 (16 - разрядность сегментых регистров) расположенных каждые 16 байт (16 - множитель значения в сегментном регистре для получения линейного адреса) и частично перекрывающихся сегментов по 2^16 (16 - разрядность смещения, как части логического адреса) байт каждый.
    Для защищённого можно и похоливарить немного, т.к. формально для выбора дескриптора сегмента в одной из двух таблиц дескрипторов (LDT и GDT) используются 14 старших бит селектора сегмента (который можно положить в сегментный регистр), что позволяет напихать таблицы дескрипторами для 2^14 различных сегментов. Но (!) что мешает хранить дополнительные дескрипторы где-нибудь ещё, а в нужный момент втыкать их в таблицы дескрипторов? Правильно ли считать, что, исходя из этих рассуждений, максимальное число сегментов ещё больше?
     
  7. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    l_inc
    Исходя из ваших рассуждений и не очень сложных знаний комбинаторики можно утверждать, что для защищенного режима возможно составить лишь 2^63 дескрипторов сегментов (не считая системных), но зачем нам столько с вводом страничного преобразования.
     
  8. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    max7C4
    Страницы и сегменты это две совершенно параллельные сущности, решающие совершенно разные задачи и никак друг на друга не влияющие.
    Имхо сегменты были суперактуальны для решения проблемы 64к в 16-битной архитектуре. После того как сегменты стали "разумного" размера актуальность иметь их в большом количестве полностью исчезла, что собственно подтверждается популярностью flat модели памяти ;). Но если для какой-то очень экзотической цели нужно их очень много, то l_inc прав - в IA32 это возможно путём динамической подмены локальных таблиц и тогда никаких ограничений на их количество нет. Хотя не представляю зачем оно может понадобиться ;).