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

 
 
> Резидент под 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
Ответов (1 - 11)
bve
сообщение Jan 28 2007, 12:33
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 316
Регистрация: 20-02-05
Из: Ленинградская обл.
Пользователь №: 2 765



Много лет назад такие авторы, как Фроловы, выпустили немколько серий книг,
например"Библиотека системного программиста...." и т.д.
В русскоязычном интернете легко найти их.
для образца прилагаю книгу, в которой описана разработкаTSR-программы.
Прикрепленный файл  frolov4.zip ( 153.07 килобайт ) Кол-во скачиваний: 183
Go to the top of the page
 
+Quote Post
InvisibleFed
сообщение Jan 28 2007, 14:05
Сообщение #3


Местный
***

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



Я читал Юрова и Зубкова. Разобрался с примерами. Но там нет ответа на мой вопрос. Спасибо за Фролова. Сейчас посмотрю.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 28 2007, 14:06
Сообщение #4


Гуру
******

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



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

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

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


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


Местный
***

Группа: Свой
Сообщений: 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
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 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
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 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
InvisibleFed
сообщение Jan 29 2007, 13:27
Сообщение #9


Местный
***

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



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


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

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


Понял, спасибо. smile.gif

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


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

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


Согласен.

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


Спасибо за наводку. А на русском ее не было? (всяко приятней читать)
Go to the top of the page
 
+Quote Post
Olej
сообщение Jan 29 2007, 14:59
Сообщение #10


Местный
***

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



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


Да ничего там "военного" нет...
Кроме того - вам очень повезло: тот исходник, который сохранился у zltigo и который он приложил:
Цитата
Присоединённые файлы
ALARM.rar ( 3.8кб ) Кол-во скачиваний: 2

Там:
1. резидент копирует критические поля PSP в своё тело (главное - это вектор завершения)...
2. ... перемещает себя в к началу PSP...
3. ... осекает весь "хвост" и остаётся TSR;
Возьмите текстуально за основу + докраивайте свою функциональность.
P.S. но я бы не стал делать п.1 (это весьма условная экономия), а смещал бы свой код к смешению 20h от начала PSP.

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

Никогда не слышал о её переводе - ищите оригинал (тем более он никому не нужен ; - не жалко))... (хотя стоимость этого оргинала, когда мне его привезли, была >$100).
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 29 2007, 15:11
Сообщение #11


Гуру
******

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



Цитата(Olej @ Jan 29 2007, 13:59) *
P.S. но я бы не стал делать п.1 (это весьма условная экономия), а смещал бы свой код к смешению 20h от начала PSP.

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
InvisibleFed
сообщение Jan 29 2007, 17:28
Сообщение #12


Местный
***

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



Всем спасибо. А буржуи книги ценят. И это правильно. Только если у нас сопоставимые цены будут - я авторов за ошибки (а их в технич. литературе много) начну убивать! maniac.gif
Go to the top of the page
 
+Quote Post

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

 


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


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