Важная информация
Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 12

Тема: Получение памяти в DOS из COM программы.

  1. #1 Получение памяти в DOS из COM программы. 
    Гуру Аватар для Абадябер
    Регистрация
    09.12.2010
    Адрес
    Беларусь, Минск
    Сообщений
    1,219
    Сказал(а) спасибо
    302
    Поблагодарили 176 раз(а) в 144 сообщениях
    Записей в блоге
    5
    Такой вопрос, ребята. Гуглил достаточно долго на эту тему, но, увы, то-ли плохо гуглил, то-ли я задаю такие уникальные вопросы, или же просто чего то не понимаю.
    Вопрос такой. Например, у меня есть листинг на асме, который компилируется в COM программу. В книге Зубкова по ассемблеру X86 (да и в других местах) строго говориться, что при запуске программы, DOS выделяет ей всю доступную на данный момент свободную память. Хорошо. У меня есть COM программа. Я знаю, что в своем 64Кб сегменте кода я волен творить что мне вздумается. Можно безопасно вести запись данных в него (разумеется, нужно следить за тем, чтобы не затереть стек и сам код - но установленные в конце листинга метки всегда скажут адрес конца кода, и начала памяти.) Хорошо. А если мне мало 64КБ? Попытка запросить новую память у DOS (функция DOS 48H, INT 21H) терпит провал, DOS говорит, что памяти совсем мало, лишь пару сотен байт осталось свободно. Не удивительно, посколько "DOS выделяет запускаемой программе всю доступную на данный момент свободную память". При запуске COM регистры инициализируются так:
    SS = DS = CS = ES. Выходит, что я не могу получить новую память, и не знаю, где еще можно безопасно записывать свои данные.
    Нельзя же ведь добавить к регистру DS 4096 и перейти на новый сегмент? В смысле, конечно можно, однако откуда я знаю, что там? Может быть, я затру тем самым управляющие структуры DOS, или кого нибудь еще?
    Не подскажете, как можно определить, в какой сегмент можно безопасно вести запись?
    Дружба-магия-радость!
    Ответить с цитированием  
     

  2. #2  
    Гуру Аватар для Konstantin Shcherba
    Регистрация
    08.11.2010
    Сообщений
    1,336
    Сказал(а) спасибо
    26
    Поблагодарили 139 раз(а) в 107 сообщениях
    Записей в блоге
    1
    В DOS можно совершенно смело использовать всю оставшуюся память за концом программы. Вектора прерываний, BIOS и структуры DOS лежат "выше" запущенной программы.
    Ответить с цитированием  
     

  3. #3  
    Гуру Аватар для Абадябер
    Регистрация
    09.12.2010
    Адрес
    Беларусь, Минск
    Сообщений
    1,219
    Сказал(а) спасибо
    302
    Поблагодарили 176 раз(а) в 144 сообщениях
    Записей в блоге
    5
    Цитата Сообщение от admin Посмотреть сообщение
    В DOS можно совершенно смело использовать всю оставшуюся память за концом программы. Вектора прерываний, BIOS и структуры DOS лежат "выше" запущенной программы.
    В смысле, всю память от конца кода программы и до физической границы в 640Кб?
    Дружба-магия-радость!
    Ответить с цитированием  
     

  4. #4  
    Гуру Аватар для Konstantin Shcherba
    Регистрация
    08.11.2010
    Сообщений
    1,336
    Сказал(а) спасибо
    26
    Поблагодарили 139 раз(а) в 107 сообщениях
    Записей в блоге
    1
    До 640кб конечно. Можно еще и память видеоадаптеров прихватить, если программа работает в текстовом режиме.

    На всякий случай картинку прилагаю.

    [Ссылки могут видеть только зарегистрированные пользователи. ]
    Ответить с цитированием  
     

  5. 3 пользователя(ей) сказали cпасибо:

    >Quiet Snow< (28.11.2011), Kakos_nonos (15.11.2011), Абадябер (15.11.2011)

  6. #5  
    Гуру Аватар для Абадябер
    Регистрация
    09.12.2010
    Адрес
    Беларусь, Минск
    Сообщений
    1,219
    Сказал(а) спасибо
    302
    Поблагодарили 176 раз(а) в 144 сообщениях
    Записей в блоге
    5
    admin, большое вам спасибо, и за картинку тоже - очень наглядно в ней все описано . Мне как раз нужна свободная память для того, чтобы транслированные LInt программы использовали сегмент кода именно как сегмент кода, а не хранили в нем переменные и стеки, а то выходит как-то не серьезно .
    Как раз, надеюсь, хотя-бы 128 килобайт получится прихватить: По 32Кб на стеки, и 64Кб на переменные.
    Тоесть, это примерно может выглядеть так?
    Код :
    mov ax,cs
    cmp ax,8000h ;(65536*10/16)-(65536*2/16) = 8000h
    ja NotEnoughMem ;если CS больше, то наши два сегмента не влазят.
    add ax,4096 ;Загружаем сегменты
    mov es,ax
    add ax,4096
    mov ds,ax
    jmp Next
    NotEnoughMem:
    Это вообще общераспространенная практика, получать доступ к памяти из COM программы именно так?
    Последний раз редактировалось Абадябер; 15.11.2011 в 00:26.
    Дружба-магия-радость!
    Ответить с цитированием  
     

  7. #6  
    Гуру Аватар для Konstantin Shcherba
    Регистрация
    08.11.2010
    Сообщений
    1,336
    Сказал(а) спасибо
    26
    Поблагодарили 139 раз(а) в 107 сообщениях
    Записей в блоге
    1
    Можно использовать под код один сегмент, а данные хранить в другом, единственное неудобство будет заключаться в том, что к ним придется обращаться используя полную адресацию (сегмент:[смещение]).

    Это вообще общераспространенная практика, получать доступ к памяти из COM программы именно так?
    Ассемблер тем и хорош, что там нет распространенных практик - используйте как Вам удобно.
    Ответить с цитированием  
     

  8. #7  
    Гуру Аватар для Абадябер
    Регистрация
    09.12.2010
    Адрес
    Беларусь, Минск
    Сообщений
    1,219
    Сказал(а) спасибо
    302
    Поблагодарили 176 раз(а) в 144 сообщениях
    Записей в блоге
    5
    Да, я уже представил себе, что для обращения к любому стеку и переменной, придется вставлять префикс смены сегмента, который будет несколько тормозить программу. Тем не менее, большое спасибо за консультацию, буду пробовать организовать все именно так.
    Дружба-магия-радость!
    Ответить с цитированием  
     

  9. #8  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,931
    Сказал(а) спасибо
    1,842
    Поблагодарили 982 раз(а) в 840 сообщениях
    Записей в блоге
    1
    Это вообще общераспространенная практика, получать доступ к памяти из COM программы именно так?
    Я вообще делал предельно тупо, заводил в коде (db, dw, dd) кучу памяти и прога дико распухала, зато дос потом всё делал за меня
    грузил сегменты, настраивал там всё, что нужно, меня это уже не касалось, просто в программе проверял, идут ли сегменты друг
    за другом(те которые должны были идти, если требовалось линейно) и если нет, то выходил. Это если решать проблему "влоб".
    Вроде бы есть специальные структуры в памяти, информация, с помощью которой можно определить чем блоки заняты, я этим
    вопросом не занимался, но посмотрите в интернете информацию по MCB(Memory Control Block), ей пользовались всякие файловые
    оболочки чтобы показать карту памяти.
    Так лучше не пытаться записать что-то просто за программу, там может находиться резидентник или ещё чего, дос же это вообще
    система достаточно нетривиальная, нет никаких чётких ограничений, вот видите вы хотите взять и записать за программу. Я тоже
    захочу, ещё кто-нть захочет и всё и пипец))) одна прога будет затирать другую, это на самом деле жестоко)))...
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

  10. #9  
    Гуру Аватар для Абадябер
    Регистрация
    09.12.2010
    Адрес
    Беларусь, Минск
    Сообщений
    1,219
    Сказал(а) спасибо
    302
    Поблагодарили 176 раз(а) в 144 сообщениях
    Записей в блоге
    5
    Вот поэтому я и беспокоюсь. Но сейчас, между прочим, я давно стал использовать именно такой подход. Запускал полученную программку под DOS, у которой загружено было порядком резидентов, вроде все норм было. Также, увидел подобное и в исходниках других программ, а также у в книге с примером программирования у Зубкова С.В. Там тоже так делают. Даже не знаю, что сказать. С одной стороны, резиденты должны грузится ниже, чем основная программы, с другой стороны, почему бы им не грузиться туда, куда им хочется =). А тут ололол, и кого то я затер =)
    Дружба-магия-радость!
    Ответить с цитированием  
     

  11. #10  
    Супер модератор Аватар для >Quiet Snow<
    Регистрация
    11.04.2011
    Адрес
    Планета земля
    Сообщений
    3,931
    Сказал(а) спасибо
    1,842
    Поблагодарили 982 раз(а) в 840 сообщениях
    Записей в блоге
    1
    Абадябер, можешь знаешь как попробовать, просканируй в программе все вектора прерываний, если ни один из них не кидает за программу, то сохрани то, что будешь затирать на диск и спокойно юзай память, а далее при выходе просто восстанови память и всё. Ну это идея такая, на асме конечно немного помучиться придётся.
    Обучение прикладному программированию(по skype), качественно, недорого, 18+, вопросы в личку.
    «Если вы ничего не сделаете, я уверяю вас, ничего и не произойдёт» © Жак Фреско
    Ограниченно модерирую.
    Ответить с цитированием  
     

Страница 1 из 2 12 ПоследняяПоследняя
Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Загрузка DLL из памяти
    от stabud в разделе FreeBasic
    Ответов: 1
    Последнее сообщение: 05.01.2013, 12:57
  2. Ответов: 2
    Последнее сообщение: 23.04.2012, 09:41
  3. Циклические программы
    от sanchez6666 в разделе QBasic
    Ответов: 7
    Последнее сообщение: 05.12.2011, 21:01
  4. Циклические программы 2
    от maxon01 в разделе QBasic
    Ответов: 9
    Последнее сообщение: 01.12.2011, 20:33
  5. Программы на СТЕПЛЕРе
    от Kakos_nonos в разделе Степлер
    Ответов: 4
    Последнее сообщение: 01.12.2011, 04:20
Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •