和普通程序的 区别: 普通程序(如一个 子函数) 调用完了 , 临时数据 就 不需要了, 分配的 内存 空间 就 回收了, 而 驻留程序 是 要保留这些的
驻留 程序 主要 用于 中断函数 , 非中断函数 也 有应用,较少。分别举个例子:
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 45hattrib 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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)