C语言编写中断驻留程序

C语言编写中断驻留程序,第1张

驻留程序 通俗点讲 就是 程序运行完了, 还要保留 临时数据 和 运行状态, 等下一次 调用时 继续 执行

和普通程序的 区别: 普通程序(如一个 子函数) 调用完了 , 临时数据 就 不需要了, 分配的 内存 空间 就 回收了, 而 驻留程序 是 要保留这些的

驻留 程序 主要 用于 中断函数 , 非中断函数 也 有应用,较少。分别举个例子:

1)用于 中断:

假设 一个 用 定时器 做的 时钟函数,定时器 设置为 1s一个中断。

main()

{

显示 时间 hour,min,sec; // 循环 刷屏显示

}

中断函数

{

sec++

if(sec>=60)

{

sec=0

min++

}

if(min>=60)

{

min=0

hour++

}

if(hour>=24)

{

hour=0

}

}

这时候 就能看出, 中断程序 在 运行完的 时候 不能 把 3个 变量 清空, 因为 下次 中断 还要用到 上次的 值, 这个程序 要 一直 驻留 内存;

2)再来个 普通 函数的

假设 做了一个程序 ,程序中 有一个 函数aa,而 函数 aa 我只能 让它执行 3次就得 关闭程序(这个 用在 密码 验证上)

aa()

{

密码验证次数n+1

返回n 和 验证结果

}

那这个 aa函数 在 密码 验证 阶段 就要 常驻 内存

驻留程序是一种特殊应用程序,它在装入内存运行后,其部分代码仍然驻留在内存,当该段代码被激活时,它又进入运行状态。常用的驻留程序是作为某个中断处理程序的一部分,其激活条件就是系统产生了此中断的中断请求。

这个完全是按照题目要求写的cursor equ 45h

attrib equ 2fh

codesegment

assume cs:code,ds:code

start:

jmp go

oldcur dw ?

old1c dw 2 dup(?)

newint1c:

pushf

call dword ptr cs:old1c

pushax

pushbx

pushcx

pushdx

xor bh,bh

mov ah,3

int 10h

mov cs:oldcur,dx

mov ah,2

xor bh,bh

mov dx,cursor

int 10h

mov ah,2ch 

int 21h ;读取系统时钟

-------------------------

ch = hour

cl = minute

dh = second

dl = 1/100 seconds

------------------------

pushdx

pushcxshow hour

pop bx

pushbx

callshowhour

callshowcolonshow minute

pop bx

callshowother

callshowcolonshow second

pop bx

callshowother

mov dx,cs:oldcur

mov ah,2

xor bh,bh

int 10h

pop dx

pop cx

pop bx

pop ax

iretshowhour proc near

pushbx

pop ax

shr ax,8

mov bl,10

div bl

-------------------------

ax = shang

dx = yushu

------------------------

add al,30h

callshow

callcurmove

mov ax,dx

add al,30h

callshow

callcurmove

ret

showhour endpshowother proc near

pushbx

pop ax

shl ax,8

shr ax,8

mov bl,10

div bl

-------------------------

ax = shang

dx = yushu

------------------------

add al,30h

callshow

callcurmove

mov ax,dx

add al,30h

callshow

callcurmove

ret

showother endp

showcolon proc near

mov al,':'

callshow

callcurmove

ret

showcolon endpcurmove proc near

pushax

pushbx

pushcx

pushdx

mov ah,3

mov bh,0

int 10h

inc dl

mov ah,2

int 10h

pop dx

pop cx

pop bx

pop ax

ret

curmove endpshowproc near

pushax

pushbx

pushcx

mov ah,09h

mov bx,attrib

mov cx,1

int 10h

pop cx

pop bx

pop ax

ret

showendpgo:

pushcs

pop ds

mov ax,351ch 取中断向量

int 21h

mov old1c,bx;保存原中断向量

mov bx,es

mov old1c+2,bx

mov dx,offset newint1c ;置新的中断向量

mov ax,251ch

int 21h

mov dx,offset go

sub dx,offset start

mov cl,4

shr dx,cl

add dx,11h

mov ax,3100h ;结束并驻留

int 21h

code ends

end start


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11785448.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存