c语言驻留,C_keep()函数用法_内存驻留程序

昨天写了一个利用int1c中断在屏幕右下方show 1-9数秒的程序。

#include "stdio.h"

#include "dos.h"

void interrupt (*oldtimer)(void);

int volatile TimerCnt;

void interrupt newtimer(void)

{

unsigned char far *dispadd;

unsigned char i;

dispadd=0xB8000000;

(*oldtimer)();

TimerCnt++;

if(TimerCnt==0x18)

{

if((i++)==10)

{

i=0;

}

TimerCnt=0;

*dispadd=0x30;

}

}

void main(int argc,char *argv[])

{

oldtimer = getvect(0x1c);

setvect(0x1c,newtimer);

printf("Exit normally\n");

getch();

}

发现程序执行后可以正常数秒,dir等dos命令也可正常执行,但是一旦run其他程序,无法再数秒,而且可能当机。

老大说应该是我的中断服务程序是在内存,当我的主程序退出后,这段内存可能在执行其他程序的时候被占用,所以有问题,要把它写成内存驻留程序。

今天在网上找到了keep这个函数,应该就是我要的,先改来试试:)

函数名: keep

功 能: 退出并继续驻留

用 法: void keep(int status, int size);

程序例:

/***NOTE:

This is an interrupt service routine. You

can NOT compile this program with Test

Stack Overflow turned on and get an

executable file which will operate

correctly. Due to the nature of this

function the formula used to compute

the number of paragraphs may not

necessarily work in all cases. Use with

care! Terminate Stay Resident (TSR)

programs are complex and no other support

for them is provided. Refer to the

MS-DOS technical documentation

for more information. */

#include

/* The clock tick interrupt */

#define INTR 0x1C

/* Screen attribute (blue on grey) */

#define ATTR 0x7900

/* reduce heaplength and stacklength

to make a smaller program in memory */

extern unsigned _heaplen = 1024;

extern unsigned _stklen = 512;

void interrupt ( *oldhandler)(void);

void interrupt handler(void)

{

unsigned int (far *screen)[80];

static int count;

/* For a color screen the video memory

is at B800:0000. For a monochrome

system use B000:000 */

screen = MK_FP(0xB800,0);

/* increase the counter and keep it

within 0 to 9 */

count++;

count %= 10;

/* put the number on the screen */

screen[0][79] = count + '0' + ATTR;

/* call the old interrupt handler */

oldhandler();

}

int main(void)

{

/* get the address of the current clock

tick interrupt */

oldhandler = getvect(INTR);

/* install the new interrupt handler */

setvect(INTR, handler);

/* _psp is the starting address of the

program in memory. The top of the stack

is the end of the program. Using _SS and

_SP together we can get the end of the

stack. You may want to allow a bit of

saftey space to insure that enough room

is being allocated ie:

(_SS + ((_SP + safety space)/16) - _psp)

*/

keep(0, (_SS + (_SP/16) - _psp));

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值