精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>C/C++>>DOS编程>>DOS中断驻留框架(1/6)

主题:DOS中断驻留框架(1/6)
发信人: 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]

[关闭][返回]