Jump to content
    

Резидент под DOS

Программеры старой школы, нужна ваша помощь. При написании TSR программы под DOS встал вопрос. Известно, что прерывания INT27 и INT31 могут оставить нужную часть кода программы резидентной (не выгруженной). Правильно ли я понимаю, что если в программе используются некоторые данные (переменная, буфер), они могут быть объявлены только в этом-же сегменте кода? Их нельзя объявить в сегменте данных. А если можно, то как?

Вопрос 2. Я пишу код по модулям в трех *.asm файлах (исходя из функционального назначения процедур и макросов). В отдельном *.ASM файле - точка входа main proc. Как сегмент кода собирает линковщик? В какой последовательности. Ведь, чтобы программа стала TSR мне нужно оставить ЧАСТЬ ее кода по вполне конкретному смещению, а следовательно нужно знать какие процедуры лежат "выше" в сегменте кода, а какие "ниже".

Понимаю, что это уже анархизм и возможно, я не совсем понятно изложил, но может кто помнит детство. :)

Share this post


Link to post
Share on other sites

Много лет назад такие авторы, как Фроловы, выпустили немколько серий книг,

например"Библиотека системного программиста...." и т.д.

В русскоязычном интернете легко найти их.

для образца прилагаю книгу, в которой описана разработкаTSR-программы.

frolov4.zip

Share this post


Link to post
Share on other sites

Я читал Юрова и Зубкова. Разобрался с примерами. Но там нет ответа на мой вопрос. Спасибо за Фролова. Сейчас посмотрю.

Share this post


Link to post
Share on other sites

Правильно ли я понимаю, что если в программе используются некоторые данные (переменная, буфер), они могут быть объявлены только в этом-же сегменте кода? Их нельзя объявить в сегменте данных

Почему это нельзя? Линкер слинкует все в один "кусок" указываете размер всего вместе и оставляете в памяти.

Как сегмент кода собирает линковщик? В какой последовательности. Ведь, чтобы программа стала TSR мне нужно оставить ЧАСТЬ ее кода по вполне конкретному смещению, а следовательно нужно знать какие процедуры лежат "выше" в сегменте кода, а какие "ниже".

По умолчанию - в порядке перечисления линкеру объектных файлов.

Share this post


Link to post
Share on other sites

Программеры старой школы, нужна ваша помощь. При написании TSR программы под DOS встал вопрос. Известно, что прерывания INT27 и INT31 могут оставить нужную часть кода программы резидентной (не выгруженной). Правильно ли я понимаю, что если в программе используются некоторые данные (переменная, буфер), они могут быть объявлены только в этом-же сегменте кода? Их нельзя объявить в сегменте данных. А если можно, то как?

Ого ... дела давние :laugh:

1. в линейном незащищённом 16-битном пространстве MS-DOS понятия сегмент данных, сегмент кода... - весьма условные, вы сами можете управляться с памятью как хотите - см. недокументированную Fun52h (кажется) INT21h - "list of list" - с ней вы можете кроить всё что угодно. Хотя в TSR чаще устанавливается DS=CS; с пмощью той же информации "list of list" вы можете вообще двигать свой TSR по всей памяти MS-DOS куда хотите.

 

Вопрос 2. Я пишу код по модулям в трех *.asm файлах (исходя из функционального назначения процедур и макросов). В отдельном *.ASM файле - точка входа main proc. Как сегмент кода собирает линковщик? В какой последовательности. Ведь, чтобы программа стала TSR мне нужно оставить ЧАСТЬ ее кода по вполне конкретному смещению, а следовательно нужно знать какие процедуры лежат "выше" в сегменте кода, а какие "ниже".

 

2. линковщик собирает объектные файлы ровно в том порядке, как они ему заказаны, во-первых, вы можете просто не отрезать хвост TSR и часто так делают, во-вторых - поместить инициализирующие (отсекаемые позже) части в хвост бинарного образа; в 16-разр. простреанстве определить модулю где он находится - не проблема.

 

Главные проблемы у вас будут не в том, как оставить образ TSR в памяти, а ... очень коротко:

- не затирать и не освобождать область PSP (по крайней мере еёначальную часть, не помню точно, 16? 32? байт связи с системой ... в оставшуюся часть можете переместить свой TSR код);

- при динамической активации вашего TSR позже: а). сохранять PSP задачи, которую прерывает ваш TSR + б). восстанавливать исходный PSP своего TSR + в). после отработки TSR восстанавливать сохранённый PSP прерванной задачи.

 

В общем, матата ещё та :angry2:

 

Фроловых книжка, которую упоминали - лучшее что написано, пожалуй, на русском языке ... но и она "галлопом по европам" и только по поверхности.

Была такая книжка (оригинальная англоязычная) "MS-DOS Bible", стр. >1000 - поскольку она теперь никому не нужна, то должна быть залежалая у кого-то или в библиотеке.

Share this post


Link to post
Share on other sites

- не затирать и не освобождать область PSP (по крайней мере еёначальную часть, не помню точно, 16? 32? байт связи с системой ... в оставшуюся часть можете переместить свой TSR код);

Не так категорично :) зависит от использования системных вызовов.

В качестве доказательства - моя первая программка для IBM PC/AT начала 90x (копался с "новинкой" - 54 таймером :) ) комады все еще только 86, мастерство еще не то :(, но PSP отсутствует начисто.

Предмет "особой гордости" тех времен - 64 байта в резиденте.

ALARM.rar

Share this post


Link to post
Share on other sites

В качестве доказательства - моя первая программка для IBM PC/AT начала 90x (копался с "новинкой" - 54 таймером :) ) комады все еще только 86, мастерство еще не то :(, но PSP отсутствует начисто.

"Не верю"(с) Станиславский ;)

Как может PSP отсутствовать начисто, если его для вашего приложения при запуске, хотите вы того или нет - создаёт MS-DOS, для формата .COM (а какой ещё формат вы могли использовать для TSR в начале 90-х ? ;) ... да и в .EXE формате бинарному коду предшествует "область информации перемещения" а не PSP, который создаст сама система - на то он и Programm Segment Prefix) область PSP задачи и не отображается в загрузочном образе вашей задачи, вы её и не видите ("ты видишь суслика? и я не вижу - но он есть"(с))... и единственный способ для задачи использовать область PSP - это после загрузки самостоятельно переместить свой же собственный код в область PSP, вперёд, но не выше некоторой "головы" (размер которой я сейчас уже точно не могу вспомнить, но он очень небольшой), отвечающей за связь задачи с MS-DOS, а вот если выше, в область связи - то просто разрушается MS-DOS: всё, зависли, приехали ;)

 

Предмет "особой гордости" тех времен - 64 байта в резиденте.

Да ... 64 байта + 256 байт области PSP ;)

... это всё можно хорошо увидеть, пройдя по цепочке "list of list" по блокам MCB.

Share this post


Link to post
Share on other sites

"Не верю"(с) Станиславский ;)

Доказательства в исходниках находятся в приложении :) комментарии там имеются.

Предмет "особой гордости" тех времен - 64 байта в резиденте.

Да ... 64 байта + 256 байт области PSP ;)

... это всё можно хорошо увидеть, пройдя по цепочке "list of list" по блокам MCB.

PSP отсутствует :). Запустите и пройдите :) могу даже исполняемый приложить и смотрелку MCB :). По этой схеме я не менее дюжины резидентов написал.

и единственный способ для задачи использовать область PSP - это после загрузки самостоятельно переместить свой же собственный код в область PSP

Оно и есть - перехватчик при выходе.

но не выше некоторой "головы" (размер которой я сейчас уже точно не могу вспомнить, но он очень небольшой), отвечающей за связь задачи с MS-DOS, а вот если выше, в область связи - то просто разрушается MS-DOS: всё, зависли, приехали

Там два "критических" размера 32 и 128 байт. Сколько оставлять и оставлять-ли зависит от необходимости пользоваться некоторыми системными DOS вызовами.

Share this post


Link to post
Share on other sites

Почему это нельзя? Линкер слинкует все в один "кусок" указываете размер всего вместе и оставляете в памяти.

 

И что это будет за сегмент такой? Сегмент0 = Сегмент_даных+Сегмент_кода? Не мог бы разъяснить?

 

По умолчанию - в порядке перечисления линкеру объектных файлов.

 

Понял, спасибо. :)

 

Главные проблемы у вас будут не в том, как оставить образ TSR в памяти, а ... очень коротко:

- не затирать и не освобождать область PSP (по крайней мере еёначальную часть, не помню точно, 16? 32? байт связи с системой ... в оставшуюся часть можете переместить свой TSR код);

- при динамической активации вашего TSR позже: а). сохранять PSP задачи, которую прерывает ваш TSR + б). восстанавливать исходный PSP своего TSR + в). после отработки TSR восстанавливать сохранённый PSP прерванной задачи.

 

О мой мозг!!! Пока даже спрашивать не хочу. :ohmy: Хотя принцип уловил.

 

Фроловых книжка, которую упоминали - лучшее что написано, пожалуй, на русском языке ... но и она "галлопом по европам" и только по поверхности.

 

Согласен.

 

Была такая книжка (оригинальная англоязычная) "MS-DOS Bible", стр. >1000 - поскольку она теперь никому не нужна, то должна быть залежалая у кого-то или в библиотеке.

 

Спасибо за наводку. А на русском ее не было? (всяко приятней читать)

Share this post


Link to post
Share on other sites

О мой мозг!!! Пока даже спрашивать не хочу. :ohmy: Хотя принцип уловил.

 

Да ничего там "военного" нет...

Кроме того - вам очень повезло: тот исходник, который сохранился у zltigo и который он приложил:

Присоединённые файлы

ALARM.rar ( 3.8кб ) Кол-во скачиваний: 2

Там:

1. резидент копирует критические поля PSP в своё тело (главное - это вектор завершения)...

2. ... перемещает себя в к началу PSP...

3. ... осекает весь "хвост" и остаётся TSR;

Возьмите текстуально за основу + докраивайте свою функциональность.

P.S. но я бы не стал делать п.1 (это весьма условная экономия), а смещал бы свой код к смешению 20h от начала PSP.

 

Спасибо за наводку. А на русском ее не было? (всяко приятней читать)

Никогда не слышал о её переводе - ищите оригинал (тем более он никому не нужен ; - не жалко))... (хотя стоимость этого оргинала, когда мне его привезли, была >$100).

Share this post


Link to post
Share on other sites

P.S. но я бы не стал делать п.1 (это весьма условная экономия), а смещал бы свой код к смешению 20h от начала PSP.

Да это просто был экзерсис :) - не думаю, что вообще PSP трогать надо - путь живет.

Share this post


Link to post
Share on other sites

Всем спасибо. А буржуи книги ценят. И это правильно. Только если у нас сопоставимые цены будут - я авторов за ошибки (а их в технич. литературе много) начну убивать! :maniac:

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...