реклама на сайте
подробности

 
 
> Резидент под DOS, Сегменты данных, модульность
InvisibleFed
сообщение Jan 28 2007, 12:20
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 401
Регистрация: 18-11-06
Из: Хабаровск
Пользователь №: 22 469



Программеры старой школы, нужна ваша помощь. При написании TSR программы под DOS встал вопрос. Известно, что прерывания INT27 и INT31 могут оставить нужную часть кода программы резидентной (не выгруженной). Правильно ли я понимаю, что если в программе используются некоторые данные (переменная, буфер), они могут быть объявлены только в этом-же сегменте кода? Их нельзя объявить в сегменте данных. А если можно, то как?
Вопрос 2. Я пишу код по модулям в трех *.asm файлах (исходя из функционального назначения процедур и макросов). В отдельном *.ASM файле - точка входа main proc. Как сегмент кода собирает линковщик? В какой последовательности. Ведь, чтобы программа стала TSR мне нужно оставить ЧАСТЬ ее кода по вполне конкретному смещению, а следовательно нужно знать какие процедуры лежат "выше" в сегменте кода, а какие "ниже".
Понимаю, что это уже анархизм и возможно, я не совсем понятно изложил, но может кто помнит детство. smile.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Olej
сообщение Jan 28 2007, 14:53
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458



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

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

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


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

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

В общем, матата ещё та angry.gif

Фроловых книжка, которую упоминали - лучшее что написано, пожалуй, на русском языке ... но и она "галлопом по европам" и только по поверхности.
Была такая книжка (оригинальная англоязычная) "MS-DOS Bible", стр. >1000 - поскольку она теперь никому не нужна, то должна быть залежалая у кого-то или в библиотеке.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 28 2007, 21:02
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Olej @ Jan 28 2007, 13:53) *
- не затирать и не освобождать область PSP (по крайней мере еёначальную часть, не помню точно, 16? 32? байт связи с системой ... в оставшуюся часть можете переместить свой TSR код);

Не так категорично smile.gif зависит от использования системных вызовов.
В качестве доказательства - моя первая программка для IBM PC/AT начала 90x (копался с "новинкой" - 54 таймером smile.gif ) комады все еще только 86, мастерство еще не то sad.gif, но PSP отсутствует начисто.
Предмет "особой гордости" тех времен - 64 байта в резиденте.
Прикрепленные файлы
Прикрепленный файл  ALARM.rar ( 3.8 килобайт ) Кол-во скачиваний: 88
 


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Olej
сообщение Jan 28 2007, 23:04
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458



Цитата(zltigo @ Jan 28 2007, 22:02) *
В качестве доказательства - моя первая программка для IBM PC/AT начала 90x (копался с "новинкой" - 54 таймером smile.gif ) комады все еще только 86, мастерство еще не то sad.gif, но PSP отсутствует начисто.

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

Цитата(zltigo @ Jan 28 2007, 22:02) *
Предмет "особой гордости" тех времен - 64 байта в резиденте.

Да ... 64 байта + 256 байт области PSP wink.gif
... это всё можно хорошо увидеть, пройдя по цепочке "list of list" по блокам MCB.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 28 2007, 23:16
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Olej @ Jan 28 2007, 22:04) *
"Не верю"(с) Станиславский wink.gif

Доказательства в исходниках находятся в приложении smile.gif комментарии там имеются.
Цитата
Цитата(zltigo @ Jan 28 2007, 22:02) *

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

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

PSP отсутствует smile.gif. Запустите и пройдите smile.gif могу даже исполняемый приложить и смотрелку MCB smile.gif. По этой схеме я не менее дюжины резидентов написал.
Цитата
и единственный способ для задачи использовать область PSP - это после загрузки самостоятельно переместить свой же собственный код в область PSP

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

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th June 2025 - 06:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01414 секунд с 7
ELECTRONIX ©2004-2016