我无法理解终止驻留和中断服务例程代码语法和一些概念之间的区别。我正在学习计算机组织汇编语言。我有这个代码,请告诉我,我是否正确认识到tsr和isr? (我3小时后就开始考试了。)
是tsr?
.model tiny
.data
msg db "You can't divide a number by zero$"
.code
mov ax,@data
mov ds,ax
mov ax,0
mov es,ax
mov bx,offset isr
mov es:[0h*4],bx
mov es:[0h*4+2],cs
mov ah,31h
int 21h
isr proc far
mov ax,@data
mov ds,ax
mov ah,9h
lea dx,msg
int 21h
mov ah,4ch
int 21h
iret
isr endp
end
是那个吗?
.model small
.data
msg db "UCP$"
oldisr dd ?
.code
main proc
mov ax,@data
mov ds,ax
mov ax,0
mov es,ax
mov bx,es:[21h*4]
mov oldisr,bx
mov bx,es:[21h*4+2]
mov [oldisr+2],bx
mov bx,offset myproc
mov es:[21h*4],bx
mov es:[21h*4+2],cs
mov dx,offset msg
mov ah,4ch
int 21h
hlt
main endp
myproc proc far
cmp ah,9h
jne l1
mov ah,4ch
jmp l2
l1:
cmp ah,4ch
jne l2
mov ah,9h
l2:
pushf
call far ds:[oldisr]
iret
myproc endp
end
答案 0 :(得分:0)
这是两个相关的概念;他们经常在一起,但不一定。不要让名字相似性让你感到困惑。
ISR表示“中断服务程序”。这意味着 - 它是在发生中断时调用的一段代码(通常是硬件驱动的,即计时器或键盘,但不一定)。实模式系统(如MS-DOS)中的ISR列在地址0000:0000的中断表中。有256个中断向量 - 即中断处理程序的远地址。您可以将其中一个更改为您自己的程序中的地址。但是有一个问题:通常,当程序终止时,它过去占用的地址范围将返回给操作系统,操作系统可以自由地将其用于其他操作系统。这就是TSR的概念所在。
TSR代表“终止并留住”。这意味着 - 程序已完成运行,但其代码和数据仍保留在内存中。这是在DOS中通过int 21h,函数31h实现的。当一个程序挂起一个中断向量并且没有将它恢复到最后的原始值时,它最好保持驻留状态 - 否则一旦卸载程序,向量值将无效。
因此,回顾一下:TSR是一种终止不卸载程序的方法。有时这个词用于程序本身。 ISR是该程序中的例程(函数,过程等),它通过中断向量在调用中断时获得控制权。
在一个不驻留的程序中可以有一个ISR;但在这种情况下,向量连接可能只在程序执行时持续。在终止之前,它应该将向量恢复为原始值;否则,下一次执行该中断的尝试会使系统崩溃。
也可以使TSR程序不挂钩任何中断,因此没有ISR。但是这一点很少。 DOS没有提供任何其他普遍接受的TSR程序重新激活方法。
答案 1 :(得分:0)
这是一个令人难以置信的古老问题,已被全场否决,措词几乎难以理解,但我想你要问的是:
a)TSR和ISR有什么区别?
b)这些程序之一是TSR,另一个是ISR吗?
B的答案是否定的。它们都是TSR。第二个只是手动安装其ISR,然后通过DOS2.0 +退出调用(带有返回值,AH = 4Ch)退出,而不是通过DOS1.0 +退出调用(没有返回值,AH = 0)退出,并且通过DOS 2.0+ T 终止并 S 第二次安装通过 R 驻留电话(AH = 31h)。
A的答案是ISR( I 连续 S 服务 R 外部)由TSR安装,并且是该部分在程序的其余部分 T 终止后, S 停留 R 的程序。
因此,ISR是一个 I 中断 S 服务 R 程序,它服务于中断,并且是由ISR安装的部分。 TSR程序 T 终止, S 保持 R 身份。
我知道OP可能永远都不会看到此信息(该职位已经有4年历史了,但我想如果还有其他问题,请随时回复。