InvisibleFed 0 January 28, 2007 Posted January 28, 2007 · Report post Программеры старой школы, нужна ваша помощь. При написании TSR программы под DOS встал вопрос. Известно, что прерывания INT27 и INT31 могут оставить нужную часть кода программы резидентной (не выгруженной). Правильно ли я понимаю, что если в программе используются некоторые данные (переменная, буфер), они могут быть объявлены только в этом-же сегменте кода? Их нельзя объявить в сегменте данных. А если можно, то как? Вопрос 2. Я пишу код по модулям в трех *.asm файлах (исходя из функционального назначения процедур и макросов). В отдельном *.ASM файле - точка входа main proc. Как сегмент кода собирает линковщик? В какой последовательности. Ведь, чтобы программа стала TSR мне нужно оставить ЧАСТЬ ее кода по вполне конкретному смещению, а следовательно нужно знать какие процедуры лежат "выше" в сегменте кода, а какие "ниже". Понимаю, что это уже анархизм и возможно, я не совсем понятно изложил, но может кто помнит детство. :) Quote Share this post Link to post Share on other sites More sharing options...
bve 1 January 28, 2007 Posted January 28, 2007 · Report post Много лет назад такие авторы, как Фроловы, выпустили немколько серий книг, например"Библиотека системного программиста...." и т.д. В русскоязычном интернете легко найти их. для образца прилагаю книгу, в которой описана разработкаTSR-программы. frolov4.zip Quote Share this post Link to post Share on other sites More sharing options...
InvisibleFed 0 January 28, 2007 Posted January 28, 2007 · Report post Я читал Юрова и Зубкова. Разобрался с примерами. Но там нет ответа на мой вопрос. Спасибо за Фролова. Сейчас посмотрю. Quote Share this post Link to post Share on other sites More sharing options...
zltigo 4 January 28, 2007 Posted January 28, 2007 · Report post Правильно ли я понимаю, что если в программе используются некоторые данные (переменная, буфер), они могут быть объявлены только в этом-же сегменте кода? Их нельзя объявить в сегменте данных Почему это нельзя? Линкер слинкует все в один "кусок" указываете размер всего вместе и оставляете в памяти. Как сегмент кода собирает линковщик? В какой последовательности. Ведь, чтобы программа стала TSR мне нужно оставить ЧАСТЬ ее кода по вполне конкретному смещению, а следовательно нужно знать какие процедуры лежат "выше" в сегменте кода, а какие "ниже". По умолчанию - в порядке перечисления линкеру объектных файлов. Quote Share this post Link to post Share on other sites More sharing options...
Olej 1 January 28, 2007 Posted January 28, 2007 · Report post Программеры старой школы, нужна ваша помощь. При написании 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 - поскольку она теперь никому не нужна, то должна быть залежалая у кого-то или в библиотеке. Quote Share this post Link to post Share on other sites More sharing options...
zltigo 4 January 28, 2007 Posted January 28, 2007 · Report post - не затирать и не освобождать область PSP (по крайней мере еёначальную часть, не помню точно, 16? 32? байт связи с системой ... в оставшуюся часть можете переместить свой TSR код); Не так категорично :) зависит от использования системных вызовов. В качестве доказательства - моя первая программка для IBM PC/AT начала 90x (копался с "новинкой" - 54 таймером :) ) комады все еще только 86, мастерство еще не то :(, но PSP отсутствует начисто. Предмет "особой гордости" тех времен - 64 байта в резиденте. ALARM.rar Quote Share this post Link to post Share on other sites More sharing options...
Olej 1 January 28, 2007 Posted January 28, 2007 · Report post В качестве доказательства - моя первая программка для 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. Quote Share this post Link to post Share on other sites More sharing options...
zltigo 4 January 28, 2007 Posted January 28, 2007 · Report post "Не верю"(с) Станиславский ;) Доказательства в исходниках находятся в приложении :) комментарии там имеются. Предмет "особой гордости" тех времен - 64 байта в резиденте. Да ... 64 байта + 256 байт области PSP ;) ... это всё можно хорошо увидеть, пройдя по цепочке "list of list" по блокам MCB. PSP отсутствует :). Запустите и пройдите :) могу даже исполняемый приложить и смотрелку MCB :). По этой схеме я не менее дюжины резидентов написал. и единственный способ для задачи использовать область PSP - это после загрузки самостоятельно переместить свой же собственный код в область PSP Оно и есть - перехватчик при выходе. но не выше некоторой "головы" (размер которой я сейчас уже точно не могу вспомнить, но он очень небольшой), отвечающей за связь задачи с MS-DOS, а вот если выше, в область связи - то просто разрушается MS-DOS: всё, зависли, приехали Там два "критических" размера 32 и 128 байт. Сколько оставлять и оставлять-ли зависит от необходимости пользоваться некоторыми системными DOS вызовами. Quote Share this post Link to post Share on other sites More sharing options...
InvisibleFed 0 January 29, 2007 Posted January 29, 2007 · Report post Почему это нельзя? Линкер слинкует все в один "кусок" указываете размер всего вместе и оставляете в памяти. И что это будет за сегмент такой? Сегмент0 = Сегмент_даных+Сегмент_кода? Не мог бы разъяснить? По умолчанию - в порядке перечисления линкеру объектных файлов. Понял, спасибо. :) Главные проблемы у вас будут не в том, как оставить образ TSR в памяти, а ... очень коротко: - не затирать и не освобождать область PSP (по крайней мере еёначальную часть, не помню точно, 16? 32? байт связи с системой ... в оставшуюся часть можете переместить свой TSR код); - при динамической активации вашего TSR позже: а). сохранять PSP задачи, которую прерывает ваш TSR + б). восстанавливать исходный PSP своего TSR + в). после отработки TSR восстанавливать сохранённый PSP прерванной задачи. О мой мозг!!! Пока даже спрашивать не хочу. :ohmy: Хотя принцип уловил. Фроловых книжка, которую упоминали - лучшее что написано, пожалуй, на русском языке ... но и она "галлопом по европам" и только по поверхности. Согласен. Была такая книжка (оригинальная англоязычная) "MS-DOS Bible", стр. >1000 - поскольку она теперь никому не нужна, то должна быть залежалая у кого-то или в библиотеке. Спасибо за наводку. А на русском ее не было? (всяко приятней читать) Quote Share this post Link to post Share on other sites More sharing options...
Olej 1 January 29, 2007 Posted January 29, 2007 · Report post О мой мозг!!! Пока даже спрашивать не хочу. :ohmy: Хотя принцип уловил. Да ничего там "военного" нет... Кроме того - вам очень повезло: тот исходник, который сохранился у zltigo и который он приложил: Присоединённые файлы ALARM.rar ( 3.8кб ) Кол-во скачиваний: 2 Там: 1. резидент копирует критические поля PSP в своё тело (главное - это вектор завершения)... 2. ... перемещает себя в к началу PSP... 3. ... осекает весь "хвост" и остаётся TSR; Возьмите текстуально за основу + докраивайте свою функциональность. P.S. но я бы не стал делать п.1 (это весьма условная экономия), а смещал бы свой код к смешению 20h от начала PSP. Спасибо за наводку. А на русском ее не было? (всяко приятней читать) Никогда не слышал о её переводе - ищите оригинал (тем более он никому не нужен ; - не жалко))... (хотя стоимость этого оргинала, когда мне его привезли, была >$100). Quote Share this post Link to post Share on other sites More sharing options...
zltigo 4 January 29, 2007 Posted January 29, 2007 · Report post P.S. но я бы не стал делать п.1 (это весьма условная экономия), а смещал бы свой код к смешению 20h от начала PSP. Да это просто был экзерсис :) - не думаю, что вообще PSP трогать надо - путь живет. Quote Share this post Link to post Share on other sites More sharing options...
InvisibleFed 0 January 29, 2007 Posted January 29, 2007 · Report post Всем спасибо. А буржуи книги ценят. И это правильно. Только если у нас сопоставимые цены будут - я авторов за ошибки (а их в технич. литературе много) начну убивать! :maniac: Quote Share this post Link to post Share on other sites More sharing options...