发信人: 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]
|
|