|
Виж темите без отговор | Виж активните теми
Дата и час: Пет Авг 21, 2026 9:51 am
|
Страница 1 от 1
|
[ 7 мнения ] |
|
Как се прави резидентна програма под ДОС?
| Автор |
Съобщение |
|
Начинаещ
Ранг: Минаващ
Регистриран на: Нед Мар 18, 2007 7:58 pm Мнения: 6
|
 Как се прави резидентна програма под ДОС?
Здравейте!
Изучавам С++ като пиша програмки за ДОС ОС. Пиша програма която да отчета времето на работа с компютъра. Но понеже под ДОС може да се работи само една програма, ми се налага да я напиша като резидентно. Но досега не съм програмирал резидентни програми.
Моля, ако някой знае как става това да ми отговори.
|
| Чет Юни 21, 2007 10:35 pm |
|
 |
|
zaphod
Ранг: Форумен бог
Регистриран на: Нед Юли 24, 2005 10:28 am Мнения: 2692
|
във началото на паметта има област наречена "векторна таблица", където са записани адресите на процедурите които се викат при разни събития. резидентните програми си стоят в паметта и записват адреса си във векторната таблица, на събитие което ги интересува. когато се извика ако иска може да извика след себе си оригиналната функция, ако не иска отебава.имай предвид че в съвременните ос тоя механизъм не се ползва вече, така че само ще ти размъти главата. и защо пишеш ДОС ОС, като последното ОС на ДОС значи същото?
|
| Пет Юни 22, 2007 8:29 am |
|
 |
|
Cvetanov
Ранг: Новодошъл
Регистриран на: Пон Фев 21, 2005 2:14 pm Мнения: 191 Местоположение: Varna
|
Има няколко прекъсвания свързани с часовника и се генерират около 18 пъти в секунда. Това което се ползваше за резидентните програми мисля беше 21 или 23. Но най-добре пусни едно търсене в Гугъл. Със сигурност ще намериш много примери.
_________________ Шанс едно на милион, обикновено се случва девет от десет пъти.
|
| Пет Юни 22, 2007 9:12 am |
|
 |
|
zaphod
Ранг: Форумен бог
Регистриран на: Нед Юли 24, 2005 10:28 am Мнения: 2692
|
е не е казано че резидентната програма точно на часовника трябва да е, макар че за упражнение това е най-добрия избор.
|
| Пет Юни 22, 2007 9:45 am |
|
 |
|
ps66
Ранг: Форумен бог
Регистриран на: Пет Яну 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 |
|
 |
|
syscop
Ранг: Форумен бог
Регистриран на: Пет Юни 03, 2005 9:39 pm Мнения: 2283
|
Горното ще освободи паметта заемана от обкръжението. Aко все пак момъка се сети да извика някъде по-долу
asm mov ah, 31h
asm mov al, retCode
asm int 21h
и успешно се е закачил за някое прекъсване, може и програмата да остане резидентна, че и да работи 
|
| Съб Юни 23, 2007 12:14 am |
|
 |
|
ps66
Ранг: Форумен бог
Регистриран на: Пет Яну 19, 2007 9:16 am Мнения: 1063 Местоположение: путинофили: "иди н***й"
|
да прав си  бях модифицирал 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 |
|
|
|
Страница 1 от 1
|
[ 7 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 0 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|