Отговори на тема  [ 7 мнения ] 
Как се прави резидентна програма под ДОС? 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Мар 18, 2007 7:58 pm
Мнения: 6
Мнение Как се прави резидентна програма под ДОС?
Здравейте!

Изучавам С++ като пиша програмки за ДОС ОС. Пиша програма която да отчета времето на работа с компютъра. Но понеже под ДОС може да се работи само една програма, ми се налага да я напиша като резидентно. Но досега не съм програмирал резидентни програми.
Моля, ако някой знае как става това да ми отговори.


Чет Юни 21, 2007 10:35 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юли 24, 2005 10:28 am
Мнения: 2692
Мнение 
във началото на паметта има област наречена "векторна таблица", където са записани адресите на процедурите които се викат при разни събития. резидентните програми си стоят в паметта и записват адреса си във векторната таблица, на събитие което ги интересува. когато се извика ако иска може да извика след себе си оригиналната функция, ако не иска отебава.имай предвид че в съвременните ос тоя механизъм не се ползва вече, така че само ще ти размъти главата. и защо пишеш ДОС ОС, като последното ОС на ДОС значи същото?


Пет Юни 22, 2007 8:29 am
Профил
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Пон Фев 21, 2005 2:14 pm
Мнения: 191
Местоположение: Varna
Мнение 
zaphod написа:
във началото на паметта има област наречена "векторна таблица", където са записани адресите на процедурите които се викат при разни събития. резидентните програми си стоят в паметта и записват адреса си във векторната таблица, на събитие което ги интересува. когато се извика ако иска може да извика след себе си оригиналната функция, ако не иска отебава.имай предвид че в съвременните ос тоя механизъм не се ползва вече, така че само ще ти размъти главата. и защо пишеш ДОС ОС, като последното ОС на ДОС значи същото?


Има няколко прекъсвания свързани с часовника и се генерират около 18 пъти в секунда. Това което се ползваше за резидентните програми мисля беше 21 или 23. Но най-добре пусни едно търсене в Гугъл. Със сигурност ще намериш много примери.

_________________
Шанс едно на милион, обикновено се случва девет от десет пъти.


Пет Юни 22, 2007 9:12 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юли 24, 2005 10:28 am
Мнения: 2692
Мнение 
е не е казано че резидентната програма точно на часовника трябва да е, макар че за упражнение това е най-добрия избор.


Пет Юни 22, 2007 9:45 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 9:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение Re: Как се прави резидентна програма под ДОС?
Начинаещ написа:
Здравейте!

Изучавам С++ като пиша програмки за ДОС ОС. Пиша програма която да отчета времето на работа с компютъра. Но понеже под ДОС може да се работи само една програма, ми се налага да я напиша като резидентно. Но досега не съм програмирал резидентни програми.
Моля, ако някой знае как става това да ми отговори.


за да остане резидентна - при излизане трябва да извика някоя от функциите на INT 21 за да не се освободи паметта и.
понеже няма кой да и дава време за работа (иначе си е зает блок памет) трябва да е вързана към някое прекъсване (таблицата с векторите)
най-добре INT8 (55мс), CMOS часовника (през 1мс) или друго (RS232, клавиатура ....)
трябва да се грижиш за запазване на регистрите, критичния флаг за ДОС, ...

не си заслужава да започваш с това - ще ти е полезно ... само да даваш ъкъл по форумите :)


това съм го взел от мноооого стар мой код (коментарите бяха да досовска кирилица и не стават за четене):
Цитат:
main (....)
{
...
/* ­ DTA */
asm MOV AH, 2Fh
asm INT 21h
/* ES:BX ?? ­ DTA */
asm MOV WORD PTR CS:[lpDTAmy+0], BX /* ???? DTA */
asm MOV WORD PTR CS:[lpDTAmy+2], ES /* ???? DTA */

/* ??? */
asm MOV AH,62h /* Get PSP */
asm INT 21H
asm MOV CS:[PSP_ADRESS],BX
asm MOV ES,BX
asm MOV BX,WORD PTR ES:[2Ch]
asm MOV CS:[PSP_ADRESS_2C],BX

asm CLI

asm SUB AX,AX
asm MOV ES,AX

/* 8h */
asm MOV AX,ES:[InterruptTIMER*4]
asm MOV WORD PTR CS:[Save_Int_8h],AX
asm MOV AX,ES:[InterruptTIMER*4+2]
asm MOV WORD PTR CS:[Save_Int_8h+2],AX
asm MOV WORD PTR ES:[InterruptTIMER*4+0],offset TimerHandler
asm MOV WORD PTR ES:[InterruptTIMER*4+2],CS

/* IRQ */
asm MOV BX, CS:[BaseIRQ] /* */
asm CMP BX, 8
asm JB E_34
asm ADD BX, 0x70-8 /* IRQ8-15 70h-77h */
asm JMP E_35
E_34:
asm ADD BX, 8 /* IRQ0-7 8-F */
E_35:
asm SHL BX,1
asm SHL BX,1
asm MOV AX,ES:[BX+0]
asm MOV WORD PTR CS:[Save_Int_RS],AX
asm MOV AX,ES:[BX+2]
asm MOV WORD PTR CS:[Save_Int_RS+2],AX
asm MOV WORD PTR ES:[BX+0],offset InterruptRSDriver
asm MOV WORD PTR ES:[BX+2],CS




/* това май трябва да я остави резидентна !? */
asm MOV ES, CS:[PSP_ADRESS_2C]
asm MOV AH, 49h
asm INT 21h
return 1;
}


Пет Юни 22, 2007 10:55 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 9:39 pm
Мнения: 2283
Мнение 
Цитат:
asm MOV ES, CS:[PSP_ADRESS_2C]
asm MOV AH, 49h
asm INT 21h


Горното ще освободи паметта заемана от обкръжението. Aко все пак момъка се сети да извика някъде по-долу
asm mov ah, 31h
asm mov al, retCode
asm int 21h
и успешно се е закачил за някое прекъсване, може и програмата да остане резидентна, че и да работи :)


Съб Юни 23, 2007 12:14 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 9:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение 
syscop написа:
Цитат:
asm MOV ES, CS:[PSP_ADRESS_2C]
asm MOV AH, 49h
asm INT 21h


Горното ще освободи паметта заемана от обкръжението. Aко все пак момъка се сети да извика някъде по-долу
asm mov ah, 31h
asm mov al, retCode
asm int 21h
и успешно се е закачил за някое прекъсване, може и програмата да остане резидентна, че и да работи :)


да прав си :)

бях модифицирал C0 така че ако main върне 1 да остане резидента:

Цитат:
...
call main@

; Flush and close streams and files
MOV CS:[ExitCodeMain],AX ;Ё§µ®¤Ґ­ Є®¤
push ax
call exit@
...

; Exit to DOS

ExitToDOS label near
CMP CS:[ExitCodeMain],1 ;Ё§µ®¤Ґ­ Є®¤
JNE E_Exit
;Є®¤ 1 - ®±І ў °Ґ§Ё¤Ґ­І­
; mov dx,43000 ;!!!
; int 27h ; Exit to DOS
mov bp,sp
mov ah,31h
mov al,3
mov dx,CS:[ProgramSize]
add dx,128/16
int 21h ; Exit to DOS
E_Exit:
;Є®¤ 0 - ­®°¬ «­® § ўє°ёў ­Ґ
mov bp,sp
mov ah,4Ch
mov al,[bp+cPtrSize]
int 21h ; Exit to DOS

EndProc@ _exit, __CDECL__
STARTX ENDP
...


иначе е добре да се насочи и един друг вектор за комуникация с резидентната програма (поне да може да се деинсталира само) :)


Съб Юни 23, 2007 7:04 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 7 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 4 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни