|
Резидент под DOS, Сегменты данных, модульность |
|
|
|
Jan 28 2007, 12:20
|
Местный
  
Группа: Свой
Сообщений: 401
Регистрация: 18-11-06
Из: Хабаровск
Пользователь №: 22 469

|
Программеры старой школы, нужна ваша помощь. При написании TSR программы под DOS встал вопрос. Известно, что прерывания INT27 и INT31 могут оставить нужную часть кода программы резидентной (не выгруженной). Правильно ли я понимаю, что если в программе используются некоторые данные (переменная, буфер), они могут быть объявлены только в этом-же сегменте кода? Их нельзя объявить в сегменте данных. А если можно, то как? Вопрос 2. Я пишу код по модулям в трех *.asm файлах (исходя из функционального назначения процедур и макросов). В отдельном *.ASM файле - точка входа main proc. Как сегмент кода собирает линковщик? В какой последовательности. Ведь, чтобы программа стала TSR мне нужно оставить ЧАСТЬ ее кода по вполне конкретному смещению, а следовательно нужно знать какие процедуры лежат "выше" в сегменте кода, а какие "ниже". Понимаю, что это уже анархизм и возможно, я не совсем понятно изложил, но может кто помнит детство.
|
|
|
|
|
 |
Ответов
(1 - 11)
|
Jan 28 2007, 12:33
|
Местный
  
Группа: Свой
Сообщений: 316
Регистрация: 20-02-05
Из: Ленинградская обл.
Пользователь №: 2 765

|
Много лет назад такие авторы, как Фроловы, выпустили немколько серий книг, например"Библиотека системного программиста...." и т.д. В русскоязычном интернете легко найти их. для образца прилагаю книгу, в которой описана разработкаTSR-программы.
frolov4.zip ( 153.07 килобайт )
Кол-во скачиваний: 183
|
|
|
|
|
Jan 28 2007, 14:06
|

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

|
Цитата(InvisibleFed @ Jan 28 2007, 11:20)  Правильно ли я понимаю, что если в программе используются некоторые данные (переменная, буфер), они могут быть объявлены только в этом-же сегменте кода? Их нельзя объявить в сегменте данных Почему это нельзя? Линкер слинкует все в один "кусок" указываете размер всего вместе и оставляете в памяти. Цитата Как сегмент кода собирает линковщик? В какой последовательности. Ведь, чтобы программа стала TSR мне нужно оставить ЧАСТЬ ее кода по вполне конкретному смещению, а следовательно нужно знать какие процедуры лежат "выше" в сегменте кода, а какие "ниже". По умолчанию - в порядке перечисления линкеру объектных файлов.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 28 2007, 14:53
|
Местный
  
Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458

|
Цитата(InvisibleFed @ Jan 28 2007, 13:20)  Программеры старой школы, нужна ваша помощь. При написании TSR программы под DOS встал вопрос. Известно, что прерывания INT27 и INT31 могут оставить нужную часть кода программы резидентной (не выгруженной). Правильно ли я понимаю, что если в программе используются некоторые данные (переменная, буфер), они могут быть объявлены только в этом-же сегменте кода? Их нельзя объявить в сегменте данных. А если можно, то как? Ого ... дела давние 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 прерванной задачи. В общем, матата ещё та Фроловых книжка, которую упоминали - лучшее что написано, пожалуй, на русском языке ... но и она "галлопом по европам" и только по поверхности. Была такая книжка (оригинальная англоязычная) "MS-DOS Bible", стр. >1000 - поскольку она теперь никому не нужна, то должна быть залежалая у кого-то или в библиотеке.
|
|
|
|
|
Jan 28 2007, 21:02
|

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

|
Цитата(Olej @ Jan 28 2007, 13:53)  - не затирать и не освобождать область PSP (по крайней мере еёначальную часть, не помню точно, 16? 32? байт связи с системой ... в оставшуюся часть можете переместить свой TSR код); Не так категорично  зависит от использования системных вызовов. В качестве доказательства - моя первая программка для IBM PC/AT начала 90x (копался с "новинкой" - 54 таймером  ) комады все еще только 86, мастерство еще не то  , но PSP отсутствует начисто. Предмет "особой гордости" тех времен - 64 байта в резиденте.
Прикрепленные файлы
ALARM.rar ( 3.8 килобайт )
Кол-во скачиваний: 88
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 28 2007, 23:04
|
Местный
  
Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458

|
Цитата(zltigo @ Jan 28 2007, 22:02)  В качестве доказательства - моя первая программка для 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: всё, зависли, приехали  Цитата(zltigo @ Jan 28 2007, 22:02)  Предмет "особой гордости" тех времен - 64 байта в резиденте. Да ... 64 байта + 256 байт области PSP  ... это всё можно хорошо увидеть, пройдя по цепочке "list of list" по блокам MCB.
|
|
|
|
|
Jan 28 2007, 23:16
|

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

|
Цитата(Olej @ Jan 28 2007, 22:04)  "Не верю"(с) Станиславский  Доказательства в исходниках находятся в приложении  комментарии там имеются. Цитата Цитата(zltigo @ Jan 28 2007, 22:02)  Предмет "особой гордости" тех времен - 64 байта в резиденте.
Да ... 64 байта + 256 байт области PSP  ... это всё можно хорошо увидеть, пройдя по цепочке "list of list" по блокам MCB. PSP отсутствует  . Запустите и пройдите  могу даже исполняемый приложить и смотрелку MCB  . По этой схеме я не менее дюжины резидентов написал. Цитата и единственный способ для задачи использовать область PSP - это после загрузки самостоятельно переместить свой же собственный код в область PSP Оно и есть - перехватчик при выходе. Цитата но не выше некоторой "головы" (размер которой я сейчас уже точно не могу вспомнить, но он очень небольшой), отвечающей за связь задачи с MS-DOS, а вот если выше, в область связи - то просто разрушается MS-DOS: всё, зависли, приехали Там два "критических" размера 32 и 128 байт. Сколько оставлять и оставлять-ли зависит от необходимости пользоваться некоторыми системными DOS вызовами.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 29 2007, 13:27
|
Местный
  
Группа: Свой
Сообщений: 401
Регистрация: 18-11-06
Из: Хабаровск
Пользователь №: 22 469

|
Цитата Почему это нельзя? Линкер слинкует все в один "кусок" указываете размер всего вместе и оставляете в памяти. И что это будет за сегмент такой? Сегмент0 = Сегмент_даных+Сегмент_кода? Не мог бы разъяснить? Цитата По умолчанию - в порядке перечисления линкеру объектных файлов. Понял, спасибо.  Цитата Главные проблемы у вас будут не в том, как оставить образ TSR в памяти, а ... очень коротко: - не затирать и не освобождать область PSP (по крайней мере еёначальную часть, не помню точно, 16? 32? байт связи с системой ... в оставшуюся часть можете переместить свой TSR код); - при динамической активации вашего TSR позже: а). сохранять PSP задачи, которую прерывает ваш TSR + б). восстанавливать исходный PSP своего TSR + в). после отработки TSR восстанавливать сохранённый PSP прерванной задачи. О мой мозг!!! Пока даже спрашивать не хочу.  Хотя принцип уловил. Цитата Фроловых книжка, которую упоминали - лучшее что написано, пожалуй, на русском языке ... но и она "галлопом по европам" и только по поверхности. Согласен. Цитата Была такая книжка (оригинальная англоязычная) "MS-DOS Bible", стр. >1000 - поскольку она теперь никому не нужна, то должна быть залежалая у кого-то или в библиотеке. Спасибо за наводку. А на русском ее не было? (всяко приятней читать)
|
|
|
|
|
Jan 29 2007, 14:59
|
Местный
  
Группа: Свой
Сообщений: 351
Регистрация: 11-09-05
Из: Харьков
Пользователь №: 8 458

|
Цитата О мой мозг!!! Пока даже спрашивать не хочу.  Хотя принцип уловил. Да ничего там "военного" нет... Кроме того - вам очень повезло: тот исходник, который сохранился у zltigo и который он приложил: Цитата Присоединённые файлы ALARM.rar ( 3.8кб ) Кол-во скачиваний: 2 Там: 1. резидент копирует критические поля PSP в своё тело (главное - это вектор завершения)... 2. ... перемещает себя в к началу PSP... 3. ... осекает весь "хвост" и остаётся TSR; Возьмите текстуально за основу + докраивайте свою функциональность. P.S. но я бы не стал делать п.1 (это весьма условная экономия), а смещал бы свой код к смешению 20h от начала PSP. Цитата Спасибо за наводку. А на русском ее не было? (всяко приятней читать) Никогда не слышал о её переводе - ищите оригинал (тем более он никому не нужен ; - не жалко))... (хотя стоимость этого оргинала, когда мне его привезли, была >$100).
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|