Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Как се прави резидентна програма под ДОС?
http://mcu-bg.com/mcu_site/viewtopic.php?f=16&t=4386
Страница 1 от 1

Автор:  Начинаещ [ Чет Юни 21, 2007 10:35 pm ]
Заглавие:  Как се прави резидентна програма под ДОС?

Здравейте!

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

Автор:  zaphod [ Пет Юни 22, 2007 8:29 am ]
Заглавие: 

във началото на паметта има област наречена "векторна таблица", където са записани адресите на процедурите които се викат при разни събития. резидентните програми си стоят в паметта и записват адреса си във векторната таблица, на събитие което ги интересува. когато се извика ако иска може да извика след себе си оригиналната функция, ако не иска отебава.имай предвид че в съвременните ос тоя механизъм не се ползва вече, така че само ще ти размъти главата. и защо пишеш ДОС ОС, като последното ОС на ДОС значи същото?

Автор:  Cvetanov [ Пет Юни 22, 2007 9:12 am ]
Заглавие: 

zaphod написа:
във началото на паметта има област наречена "векторна таблица", където са записани адресите на процедурите които се викат при разни събития. резидентните програми си стоят в паметта и записват адреса си във векторната таблица, на събитие което ги интересува. когато се извика ако иска може да извика след себе си оригиналната функция, ако не иска отебава.имай предвид че в съвременните ос тоя механизъм не се ползва вече, така че само ще ти размъти главата. и защо пишеш ДОС ОС, като последното ОС на ДОС значи същото?


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

Автор:  zaphod [ Пет Юни 22, 2007 9:45 am ]
Заглавие: 

е не е казано че резидентната програма точно на часовника трябва да е, макар че за упражнение това е най-добрия избор.

Автор:  ps66 [ Пет Юни 22, 2007 10:55 am ]
Заглавие:  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;
}

Автор:  syscop [ Съб Юни 23, 2007 12:14 am ]
Заглавие: 

Цитат:
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
и успешно се е закачил за някое прекъсване, може и програмата да остане резидентна, че и да работи :)

Автор:  ps66 [ Съб Юни 23, 2007 7:04 am ]
Заглавие: 

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
...


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

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/