⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 encaps.e

📁 minix3的源代码
💻 E
字号:
#; $Header: /cvsup/minix/src/lib/ack/libp/encaps.e,v 1.1 2005/10/10 15:27:46 beng Exp $;  (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands.; ;           This product is part of the Amsterdam Compiler Kit.; ;  Permission to use, sell, duplicate or disclose this software must be;  obtained in writing. Requests for such permissions may be sent to; ;       Dr. Andrew S. Tanenbaum;       Wiskundig Seminarium;       Vrije Universiteit;       Postbox 7161;       1007 MC Amsterdam;       The Netherlands;  mes 2,_EM_WSIZE,_EM_PSIZE; procedure encaps(procedure p; procedure(q(n:integer));; {call q if a trap occurs during the execution of p}; {if q returns, continue execution of p} inp $handler#define PIISZ   2*_EM_PSIZE#define PARG    0#define QARG    PIISZ#define E_ELB   0-_EM_PSIZE#define E_EHA   -2*_EM_PSIZE; encaps is called with two parameters:;       - procedure instance identifier of q (QARG);       - procedure instance identifier of p (PARG); and two local variables:;       - the lb of the previous encaps      (E_ELB);       - the procedure identifier of the previous handler (E_EHA);; One static variable:;       - the lb of the currently active encaps (enc_lb)enc_lb        bss _EM_PSIZE,0,0 exp $encaps pro $encaps,PIISZ ; save lb of previous encaps lae enc_lb loi _EM_PSIZE lal E_ELB sti _EM_PSIZE ; set new lb lxl 0 lae enc_lb sti _EM_PSIZE ; save old handler id while setting up the new handler lpi $handler sig lal E_EHA sti _EM_PSIZE ; handler is ready, p can be called ; p doesn't expect parameters except possibly the static link ; always passing the link won't hurt lal PARG loi PIISZ cai asp _EM_PSIZE ; reinstate old handler lal E_ELB loi _EM_PSIZE lae enc_lb sti _EM_PSIZE lal E_EHA loi _EM_PSIZE sig asp _EM_PSIZE ret 0 end ?#define TRAP    0#define H_ELB   0-_EM_PSIZE; handler is called with one parameter:;       - trap number (TRAP); one local variable;       - the current LB of the enclosing encaps (H_ELB) pro $handler,_EM_PSIZE ; save LB of nearest encaps lae enc_lb loi _EM_PSIZE lal H_ELB sti _EM_PSIZE ; fetch setting for previous encaps via LB of nearest lal H_ELB loi _EM_PSIZE adp E_ELB loi _EM_PSIZE   ; LB of previous encaps lae enc_lb sti _EM_PSIZE lal H_ELB loi _EM_PSIZE adp E_EHA loi _EM_PSIZE   ; previous handler sig asp _EM_PSIZE ; previous handler is re-instated, time to call Q lol TRAP       ; the one and only real parameter lal H_ELB loi _EM_PSIZE lpb            ; argument base of enclosing encaps adp QARG loi PIISZ exg _EM_PSIZE dup _EM_PSIZE   ; The static link is now on top zer _EM_PSIZE cmp zeq *1 ; non-zero LB exg _EM_PSIZE cai asp _EM_WSIZE+_EM_PSIZE bra *21 ; zero LB asp _EM_PSIZE cai asp _EM_WSIZE2 ; now reinstate handler for continued execution of p lal H_ELB loi _EM_PSIZE lae enc_lb sti _EM_PSIZE lpi $handler sig asp _EM_PSIZE rtt end ?

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -