发信人: riffle() 
整理人: wenbobo(2002-08-13 10:45:45), 站内信件
 | 
 
 
;/* author *** */
 
 ; INTFRAME.ASM
 ;本模块和TSRFRAME.CPP一起做一个project,在large或huge模式下编译生成LIB 。
 
 ;/*------------------------------------------------------------------- --*/
 ; Data Section
 ;/*------------------------------------------------------------------- --*/
 
 INTFRAME_DATA		segment word public 'FAR_DATA'
 
 _VectorNum		dw 0
 _OldPSP			dw 0
 
 ; 保留初始化时的堆栈值
 _TSRSS			dw 0
 _TSRSP			dw 0
 
 ; 下面为保存进入软中断后的各个寄存器
 _InterSS 		dw 0
 _InterSP		dw 0
 _InterBP		dw 0
 
 
 _InterAX  		dw 0
 _InterBX    		dw 0
 _InterCX    		dw 0
 _InterDX    		dw 0
 
 _InterSI    		dw 0
 _InterDI    		dw 0
 _InterES    		dw 0
 _InterDS  		dw 0
 
 INTFRAME_DATA		ends
 
 ;/*------------------------------------------------------------------- --*/
 ; Code Section
 ;/*------------------------------------------------------------------- --*/
 
 INTFRAME_TEXT  segment byte public 'CODE'
 	       assume	cs : INTFRAME_TEXT, ds : INTFRAME_DATA
 
 ;/*------------------------------------------------------------------- --*/
 ; void IntSer( void )
 ;/*------------------------------------------------------------------- --*/
 ;/******************************************************************** ***/
 ; 中断服务程序
 		public _IntSer
 
 _IntSer		proc far
 
 		push		bp
 		push		ax
 		push		bx
 		push		cx
 		push		dx
 		push		si
 		push		di
 		push		ds
 		push		es
 
 		; 改变数据段
 		mov		ax, INTFRAME_DATA
 		mov		ds, ax
 
 		; 先保存各寄存器
 		pop 		_InterES
 		pop		_InterDS
 		pop		_InterDI
 		pop		_InterSI
 		pop		_InterDX
 		pop		_InterCX
 		pop		_InterBX
 		pop		_InterAX
 		pop		_InterBP
 
 		; 保存进入中断的堆栈值
 		mov     	word ptr _InterSS, ss
 		mov		word ptr _InterSP, sp
 
 		; 换栈
 		cli
 		mov		ax, _TSRSS
 		mov		ss, ax
 		mov		sp, _TSRSP
 		sti
 
 		; 恢复 DS 和 AX 值
 		push		_InterAX
 		push		_InterDS
 
 		pop		ds
 		pop		ax
 
 		; 这里是 CALL XXXX:XXXX
 		; 以前已经登记了远调用地址
 		db		9ah
 _OldFarFunc:
 		dd		0
 		jmp     	short _IntNormalExit
 
 		; 这里用于特殊情况下的返回地址
                 ; 调用软中断执行退出驻留功能时,最终将使程序返回DOS,
                  ; 但是应用程序可以修改PSP中的返回地址,使其走到此处
                 ; 从而不“真正”地返回DOS,而是返回到中断服务程序中,
                  ; 最后再IRET出去,使得象调用了一个普通的软中断。
 _IntOver:
 		mov		ax, INTFRAME_DATA
 		mov		ds, ax
 
 		mov		bx, _OldPSP
 		mov		ah, 50H
 		int		21H
 
 		mov		ax, _VectorNum
 		xor		dx, dx
 		mov		ds, dx
 		mov		ah, 25H
 		int		21H
 
 _IntNormalExit:
 		; 改变数据段
 		mov		ax, INTFRAME_DATA
 		mov		ds, ax
 
 		; 恢复堆栈
 		cli
 		mov		ss, _InterSS
 		mov		sp, _InterSP
 		sti
 
 		; 重新压入各寄存器
 		push		_InterBP
 		push		_InterAX
 		push		_InterBX
 		push		_InterCX
 		push		_InterDX
 		push		_InterSI
 		push		_InterDI
 		push		_InterDS
 		push		_InterES
 
 		pop		es
 		pop		ds
 		pop		di
 		pop     	si
 		pop     	dx
 		pop     	cx
 		pop     	bx
 		pop     	ax
 		pop		bp
 
 		iret
 _IntSer		endp
 
 ;/*------------------------------------------------------------------- --*/
 ; void SaveCurPSP( void )
 ;/*------------------------------------------------------------------- --*/
 ;/******************************************************************** ***/
 ; 取当前的PSP
 		 public _SaveCurPSP
 
 _SaveCurPSP	 proc far
 		 push 		ds
 		 push		bx
 		 push		ax
 
 		 mov		ax, INTFRAME_DATA
 		 mov		ds, ax
 
 		 mov		ah, 62H
 		 int		21H
 		 mov		_OldPSP, bx
 
 		 pop		ax
 		 pop		bx
 		 pop		ds
 		 ret
 _SaveCurPSP	 endp
 
 ;/*------------------------------------------------------------------- --*/
 ; void SetPSP( int NewPSP )
 ;/*------------------------------------------------------------------- --*/
 ;/******************************************************************** ***/
 
 		 public _SetPSP
 
 _SetPSP		 proc far
 		 push 		bp
 		 mov  		bp, sp
 
 		 push 		ds
 		 push		ax
 		 push		bx
 
 		 mov		ax, INTFRAME_DATA
 		 mov		ds, ax
 
 		 mov		ah, 50H
 		 mov		bx, [ bp + 6 ]
 		 int		21H
 
 		 pop		bx
 		 pop		ax
 		 pop		ds
 
 		 pop  		bp
 		 ret
 _SetPSP		 endp
 
 ;/*------------------------------------------------------------------- --*/
 ; void SetVectorI( int VerctorNum, void far *FunPtr )
 ;/*------------------------------------------------------------------- --*/
 ;/******************************************************************** ***/
 ; 设置中断向量以及登记回调函数地址
 		 public _SetVectorI
 
 _SetVectorI  	 proc far
 		 push 		bp
 		 mov  		bp, sp
 		 push 		ds
 		 push		es
 
 		 push		ax
 		 push		dx
 
 		 ; 改变数据段
 		 mov		ax, INTFRAME_DATA
 		 mov		ds, ax
 
 		 ; 这里记录旧的堆栈值
 		 ; 其深度决定于 C 的全程变量 _stklen
 		 mov		_TSRSS, ss
 		 mov		_TSRSP, sp
 
 		 ; 登记回调函数地址
 		 les		dx, [ bp + 8 ]
 		 mov		ax, [ bp + 6 ]
 		 mov		_VectorNum, ax
 		 mov		word ptr _OldFarFunc, dx
 		 mov		word ptr _OldFarFunc + 2, es
 
 		 ; 设置中断向量
 		 push		cs
 		 pop		ds
 		 mov		dx, offset _IntSer
 
 		 mov		ah, 25H
 		 int		21h
 
 		 pop		dx
 		 pop		ax
 
 		 pop		es
 		 pop 		ds
 		 pop  		bp
 		 ret
 _SetVectorI      endp
 
 ;/*------------------------------------------------------------------- --*/
 ; void far *GetIntReturnAddr( void )
 ;/*------------------------------------------------------------------- --*/
 ;/******************************************************************** ***/
 
 ; 取中断服务程序的返回地址
 		 public _GetIntReturnAddr
 
 _GetIntReturnAddr proc far
 		 mov		dx, cs
 		 mov		ax, offset _IntOver
 		 ret
 _GetIntReturnAddr endp
 
 ;/*------------------------------------------------------------------- --*/
 ; void SetReturnAX( int iReturnAX )
 ;/*------------------------------------------------------------------- --*/
 ;/******************************************************************** ***/
 ; 设置中断返回时的 AX 值
 		 public _SetReturnAX
 
 _SetReturnAX	 proc far
 		 push  		bp
 		 mov  		bp, sp
 
 		 push 		ds
 		 push		ax
 
 		 mov		ax, INTFRAME_DATA
 		 mov		ds, ax
 
 		 mov		ax, [ bp + 6 ]
 		 mov		_InterAX, ax
 
 		 pop		ax
 		 pop		ds
 
 		 pop  		bp
 		 ret
 _SetReturnAX	 endp
 
 ;/*------------------------------------------------------------------- --*/
 ; void SetReturnBX( int iReturnBX )
 ;/*------------------------------------------------------------------- --*/
 ;/******************************************************************** ***/
 ; 设置中断返回时的 BX 值
 		 public _SetReturnBX
 
 _SetReturnBX	 proc far
 		 push 		bp
 		 mov  		bp, sp
 
 		 push 		ds
 		 push		ax
 
 		 mov		ax, INTFRAME_DATA
 		 mov		ds, ax
 
 		 mov		ax, [ bp + 6 ]
 		 mov		_InterBX, ax
 
 		 pop		ax
 		 pop		ds
 
 		 pop  		bp
 		 ret
 _SetReturnBX	 endp
 
 ;/*------------------------------------------------------------------- --*/
 ; void SetReturnCX( int iReturnCX )
 ;/*------------------------------------------------------------------- --*/
 ;/******************************************************************** ***/
 ; 设置中断返回时的 CX 值
 		 public _SetReturnCX
 
 _SetReturnCX	 proc far
 		 push 		bp
 		 mov  		bp, sp
 
 		 push 		ds
 		 push		ax
 
 		 mov		ax, INTFRAME_DATA
 		 mov		ds, ax
 
 		 mov		ax, [ bp + 6 ]
 		 mov		_InterCX, ax
 
 		 pop		ax
 		 pop		ds
 
 		 pop  		bp
 		 ret
 _SetReturnCX	endp
 
 ;/*------------------------------------------------------------------- --*/
 ; void SetReturnDX( int iReturnDX )
 ;/*------------------------------------------------------------------- --*/
 ;/******************************************************************** ***/
 ; 设置中断返回时的 DX 值
 		 public _SetReturnDX
 
 _SetReturnDX	 proc far
 		 push 		bp
 		 mov  		bp, sp
 
 		 push 		ds
 		 push		ax
 
 		 mov		ax, INTFRAME_DATA
 		 mov		ds, ax
 
 		 mov		ax, [ bp + 6 ]
 		 mov		_InterDX, ax
 
 		 pop		ax
 		 pop		ds
 
 		 pop  		bp
 		 ret
 _SetReturnDX	endp
 
 ;/*------------------------------------------------------------------- --*/
 ; void SetReturnSI( int iReturnSI )
 ;/*------------------------------------------------------------------- --*/
 ;/******************************************************************** ***/
 ; 设置中断返回时的 SI 值
 		 public _SetReturnSI
 
 _SetReturnSI	 proc far
 		 push 		bp
 		 mov  		bp, sp
 
 		 push 		ds
 		 push		ax
 
 		 mov		ax, INTFRAME_DATA
 		 mov		ds, ax
 
 		 mov		ax, [ bp + 6 ]
 		 mov		_InterSI, ax
 
 		 pop		ax
 		 pop		ds
 
 		 pop  		bp
 		 ret
 _SetReturnSI	 endp
 
 ;/*------------------------------------------------------------------- --*/
 ; void SetReturnDI( int iReturnDI )
 ;/*------------------------------------------------------------------- --*/
 ;/******************************************************************** ***/
 ; 设置中断返回时的 DI 值
 		 public _SetReturnDI
 
 _SetReturnDI	 proc far
 		 push 		bp
 		 mov  		bp, sp
 
 		 push 		ds
 		 push		ax
 
 		 mov		ax, INTFRAME_DATA
 		 mov		ds, ax
 
 		 mov		ax, [ bp + 6 ]
 		 mov		_InterDI, ax
 
 		 pop		ax
 		 pop		ds
 
 		 pop  		bp
 		 ret
 _SetReturnDI	 endp
 
 
 ;/*------------------------------------------------------------------- --*/
 ; void SetReturnDS( int iReturnDS )
 ;/*------------------------------------------------------------------- --*/
 ;/******************************************************************** ***/
 ; 设置中断返回时的 DS 值
 		 public _SetReturnDS
 
 _SetReturnDS	 proc far
 		 push 		bp
 		 mov  		bp, sp
 
 		 push 		ds
 		 push		ax
 
 		 mov		ax, INTFRAME_DATA
 		 mov		ds, ax
 
 		 mov		ax, [ bp + 6 ]
 		 mov		_InterDS, ax
 
 		 pop		ax
 		 pop		ds
 
 		 pop  		bp
 		 ret
 _SetReturnDS	 endp
 
 ;/*------------------------------------------------------------------- --*/
 ; void SetReturnES( int iReturnES )
 ;/*------------------------------------------------------------------- --*/
 ;/******************************************************************** ***/
 ; 设置中断返回时的 ES 值
 		 public _SetReturnES
 
 _SetReturnES	 proc far
 		 push 		bp
 		 mov  		bp, sp
 
 		 push 		ds
 		 push		ax
 
 		 mov		ax, INTFRAME_DATA
 		 mov		ds, ax
 
 		 mov		ax, [ bp + 6 ]
 		 mov		_InterES, ax
 
 		 pop		ax
 		 pop		ds
 
 		 pop  		bp
 		 ret
 _SetReturnES	 endp
 
 ;/*------------------------------------------------------------------- --*/
 ; int OldAX( void )
 ;/*------------------------------------------------------------------- --*/
 ;/******************************************************************** ***/
 ; 取进入中断时的 AX 值
 		 public _OldAX
 
 _OldAX		 proc far
 		 push 		ds
 		 mov		ax, INTFRAME_DATA
 		 mov		ds, ax
 		 mov		ax, _InterAX
 		 pop		ds
 		 ret
 _OldAX		 endp
 
 ;/*------------------------------------------------------------------- --*/
 ; int OldBX( void )
 ;/*------------------------------------------------------------------- --*/
 ;/******************************************************************** ***/
 ; 取进入中断时的 BX 值
 		 public _OldBX
 
 _OldBX		 proc far
 		 push 		ds
 		 mov		ax, INTFRAME_DATA
 		 mov		ds, ax
 		 mov		ax, _InterBX
 		 pop		ds
 		 ret
 _OldBX		 endp
 
 ;/*------------------------------------------------------------------- --*/
 ; int OldCX( void )
 ;/*------------------------------------------------------------------- --*/
 ;/******************************************************************** ***/
 ; 取进入中断时的 CX 值
 		 public _OldCX
 
 _OldCX		 proc far
 		 push 		ds
 		 mov		ax, INTFRAME_DATA
 		 mov		ds, ax
 		 mov		ax, _InterCX
 		 pop		ds
 		 ret
 _OldCX		 endp
 
 ;/*------------------------------------------------------------------- --*/
 ; int OldDX( void )
 ;/*------------------------------------------------------------------- --*/
 ;/******************************************************************** ***/
 ; 取进入中断时的 DX 值
 		 public _OldDX
 
 _OldDX		 proc far
 		 push 		ds
 		 mov		ax, INTFRAME_DATA
 		 mov		ds, ax
 		 mov		ax, _InterDX
 		 pop		ds
 		 ret
 _OldDX		 endp
 
 ;/*------------------------------------------------------------------- --*/
 ; int OldSI( void )
 ;/*------------------------------------------------------------------- --*/
 ;/******************************************************************** ***/
 ; 取进入中断时的 SI 值
 		 public _OldSI
 
 _OldSI		 proc far
 		 push 		ds
 		 mov		ax, INTFRAME_DATA
 		 mov		ds, ax
 		 mov		ax, _InterSI
 		 pop		ds
 		 ret
 _OldSI		 endp
 
 ;/*------------------------------------------------------------------- --*/
 ; int OldDI( void )
 ;/*------------------------------------------------------------------- --*/
 ;/******************************************************************** ***/
 ; 取进入中断时的 DI 值
 		 public _OldDI
 
 _OldDI		 proc far
 		 push 		ds
 		 mov		ax, INTFRAME_DATA
 		 mov		ds, ax
 		 mov		ax, _InterDI
 		 pop		ds
 		 ret
 _OldDI		 endp
 
 ;/*------------------------------------------------------------------- --*/
 ; int OldDS( void )
 ;/*------------------------------------------------------------------- --*/
 ;/******************************************************************** ***/
 ; 取进入中断时的 DS 值
 		 public _OldDS
 
 _OldDS		 proc far
 		 push 		ds
 		 mov		ax, INTFRAME_DATA
 		 mov		ds, ax
 		 mov		ax, _InterDS
 		 pop		ds
 		 ret
 _OldDS		 endp
 
 ;/*------------------------------------------------------------------- --*/
 ; int OldES( void )
 ;/*------------------------------------------------------------------- --*/
 ;/******************************************************************** ***/
 ; 取进入中断时的 ES 值
 		 public _OldES
 
 _OldES		 proc far
 		 push 		ds
 		 mov		ax, INTFRAME_DATA
 		 mov		ds, ax
 		 mov		ax, _InterES
 		 pop		ds
 		 ret
 _OldES		 endp
 
 ;/*------------------------------------------------------------------- --*/
 
 INTFRAME_TEXT	 ends
 		 end
 ;/*------------------------------------------------------------------- --*/
  -- ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.104.39.56]
  | 
 
 
 |