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

|
Программеры старой школы, нужна ваша помощь. При написании TSR программы под DOS встал вопрос. Известно, что прерывания INT27 и INT31 могут оставить нужную часть кода программы резидентной (не выгруженной). Правильно ли я понимаю, что если в программе используются некоторые данные (переменная, буфер), они могут быть объявлены только в этом-же сегменте кода? Их нельзя объявить в сегменте данных. А если можно, то как? Вопрос 2. Я пишу код по модулям в трех *.asm файлах (исходя из функционального назначения процедур и макросов). В отдельном *.ASM файле - точка входа main proc. Как сегмент кода собирает линковщик? В какой последовательности. Ведь, чтобы программа стала TSR мне нужно оставить ЧАСТЬ ее кода по вполне конкретному смещению, а следовательно нужно знать какие процедуры лежат "выше" в сегменте кода, а какие "ниже". Понимаю, что это уже анархизм и возможно, я не совсем понятно изложил, но может кто помнит детство.
|
|
|
|
|
 |
Ответов
|
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
|
|
|
|
Сообщений в этой теме
InvisibleFed Резидент под DOS Jan 28 2007, 12:20 bve Много лет назад такие авторы, как Фроловы, выпусти... Jan 28 2007, 12:33 InvisibleFed Я читал Юрова и Зубкова. Разобрался с примерами. Н... Jan 28 2007, 14:05 zltigo Цитата(InvisibleFed @ Jan 28 2007, 11:20)... Jan 28 2007, 14:06 InvisibleFed ЦитатаПочему это нельзя? Линкер слинкует все в оди... Jan 29 2007, 13:27 Olej ЦитатаО мой мозг!!! Пока даже спрашива... Jan 29 2007, 14:59  zltigo Цитата(Olej @ Jan 29 2007, 13:59) P.S. н... Jan 29 2007, 15:11 InvisibleFed Всем спасибо. А буржуи книги ценят. И это правильн... Jan 29 2007, 17:28
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|