在中断嵌套时,高级别中断可能采取“自毁中断”,即关闭自身的中断允许位。 例:在采用串行中断发送数据时,常在发送最后一个字节后关闭ES. 若在低级别中断中保护IE,则高级别关闭的ES位会被误打开。 所以,最好不要惹恼IE,SP等特殊寄存器。 再者,我前面的隐身帖主要是用于低级别中断隐身的,高级别会出现问题的。 由于采用2次reti,其中第2次认为隐身程序已“降级”。 但在高级别中断隐身时,虽隐身程序已“降级”,但高级别中断嵌套返回低级别中断时,2次reti将会使低级别中断“强行降级”的,使低级别中断失去了中断特权。 所以,全面的隐身应该按以下例子为好。
intprgl:;低级别中断 push acc push psw push dpl push dph ..... acall intexitl acall subl;低级别隐身程序(允许2次reti) pop dph pop dpl pop psw pop acc intexitl: reti
subl: push 30h ....... pop 30h ret
intprgh:;高级别中断 push acc push psw push dpl push dph ..... acall intexith mov dptr,#intquith;高级别中断隐身返回地址 push dpl;压入返回地址低位 push dph;压入返回地址高位 ljmp subh;高级别隐身程序(不允许2次reti) ........................ ;高级别中断正常返回 pop dph pop dpl pop psw pop acc intexith: reti intquith:;高级别中断隐身返回 pop dph pop dpl pop psw pop acc ret
subh: push 31h ....... pop 31h clr ES;中断自毁(例ET2,ES,ET1.EX1,ET1,EX0) ret
个人意见:中断隐身技术不到万不得已,最好少用为好。。。 若用,则必须头脑冷静。。。 |
文章评论(0条评论)
登录后参与讨论