intxa386.asm
来自「开放源码的编译器open watcom 1.6.0版的源代码」· 汇编 代码 · 共 697 行 · 第 1/2 页
ASM
697 行
;*****************************************************************************
;*
;* Open Watcom Project
;*
;* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
;*
;* ========================================================================
;*
;* This file contains Original Code and/or Modifications of Original
;* Code as defined in and that are subject to the Sybase Open Watcom
;* Public License version 1.0 (the 'License'). You may not use this file
;* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
;* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
;* provided with the Original Code and Modifications, and is also
;* available at www.sybase.com/developer/opensource.
;*
;* The Original Code and all software distributed under the License are
;* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
;* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
;* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
;* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
;* NON-INFRINGEMENT. Please see the License for the specific language
;* governing rights and limitations under the License.
;*
;* ========================================================================
;*
;* Description: WHEN YOU FIGURE OUT WHAT THIS FILE DOES, PLEASE
;* DESCRIBE IT HERE!
;*
;*****************************************************************************
;
;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
;<>
;<> int int386x( int intno, union REGS *inregs, union REGS *outregs,
;<> struct SREGS *segregs )
;<> parm caller [esi] [edi] [edx] [ebx] \
;<>
;<> ========= === =======
;<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
include mdef.inc
include struct.inc
modstart int386xa
xdefp __int386x_
xdefp _DoINTR_
defp __int386x_
push ebp ; save EBP
push es ; save ES
push ebx ; save EBX (segregs)
push ds ; save DS
push edx ; save EDX (outregs)
call dointerrupt ; load registers and interrupt
push ds ; save new DS
push edi ; save EDI
mov ebp,esp ; get address of outregs struct
mov edi,8[ebp] ; ...
mov ds,12[ebp] ;
mov [edi],eax ; update registers
mov 4[edi],ebx ; ...
mov 8[edi],ecx ; ...
mov 12[edi],edx ; ...
mov 16[edi],esi ; ...
pop 20[edi] ; update edi
sbb eax,eax ; calc. value of carry flag
mov 24[edi],eax ; save carry flag status
pop eax ; (ds)
pop ebx
pop ebx
pop ebx ; restore address of segregs
mov 6[ebx],ax ; update DS
mov [ebx],es ; update ES
pop es ; restore ES
pop ebp ; restore EBP
ret ; return
endproc __int386x_
defp dointerrupt
lea esi,[esi+esi*2] ; calc interrupt # times 3
lea eax,inttable[esi] ; calc address of "int nn" instruction
push eax ; push address of "int nn" instruction
mov es,[ebx] ; load ES
mov bp,6[ebx] ; get value for DS
mov eax, [edi] ; load registers
mov ebx,4[edi] ; ...
mov ecx,8[edi] ; ...
mov edx,12[edi] ; ...
mov esi,16[edi] ; ...
mov edi,20[edi] ; ...
mov ds,bp ; load DS
ret ; return to "int nn" instruction
;struct REGPACKX {
; unsigned int eax, ebx, ecx, edx, ebp, esi, edi;
; unsigned short ds, es, fs, gs;
; unsigned int flags;
;};
RP_EAX equ 0
RP_EBX equ 4
RP_ECX equ 8
RP_EDX equ 12
RP_EBP equ 16
RP_ESI equ 20
RP_EDI equ 24
RP_DS equ 28
RP_ES equ 30
RP_FS equ 32
RP_GS equ 34
RP_F equ 36
; void _DoINTR( intnum, struct REGPACK *regs )
; /************* EAX ********* EDX **********/
defp _DoINTR_
pushad ; save regs
push gs ; ...
push fs ; ...
push es ; ...
push ds ; ...
push edx ; save pointer to REGPACK
call dointr386
push ebx ; save ebx and ds
push ds ; ...
push ebp ; save ebp
mov ebp,esp ; get access to stack
mov ebx,12[ebp] ; restore address of REGPACK
mov ds,16[ebp] ; ...
mov RP_EAX[ebx],eax ; update registers
pushfd
pop eax
mov RP_F[ebx],ax
mov RP_ECX[ebx],ecx
mov RP_EDX[ebx],edx
mov RP_ESI[ebx],esi
mov RP_EDI[ebx],edi
pop RP_EBP[ebx]
pop eax
mov RP_DS[ebx],ax
pop RP_EBX[ebx]
mov RP_ES[ebx],es
mov RP_FS[ebx],fs
mov RP_GS[ebx],gs
add esp,4*2
pop es
pop fs
pop gs
popad ; restore registers
ret
endproc _DoINTR_
defp dointr386
and eax,000000FFh ; AL has interrupt #
lea eax,[eax+eax*2] ; calc interrupt # times 3
lea eax,inttable[eax] ; calc address of "int nn" instruction
push eax ; push address of "int nn" instruction
mov ebx,edx ; get address of REGPACK
push RP_DS[ebx] ; save DS
mov eax,RP_EAX[ebx]
mov ecx,RP_ECX[ebx]
mov edx,RP_EDX[ebx]
mov esi,RP_ESI[ebx]
mov edi,RP_EDI[ebx]
mov ebp,RP_EBP[ebx]
mov es,RP_ES[ebx]
mov fs,RP_FS[ebx]
mov gs,RP_GS[ebx]
mov ebx,RP_EBX[ebx]
pop ds ; load ds
ret ; return to "int nn" instruction
dointr386 endp
inttable:
int 0
ret
int 1
ret
int 2
ret
int 3
nop
ret
int 4
ret
int 5
ret
int 6
ret
int 7
ret
int 8
ret
int 9
ret
int 10
ret
int 11
ret
int 12
ret
int 13
ret
int 14
ret
int 15
ret
int 16
ret
int 17
ret
int 18
ret
int 19
ret
int 20
ret
int 21
ret
int 22
ret
int 23
ret
int 24
ret
int 25
ret
int 26
ret
int 27
ret
int 28
ret
int 29
ret
int 30
ret
int 31
ret
int 32
ret
int 33
ret
int 34
ret
int 35
ret
int 36
ret
int 37
ret
int 38
ret
int 39
ret
int 40
ret
int 41
ret
int 42
ret
int 43
ret
int 44
ret
int 45
ret
int 46
ret
int 47
ret
int 48
ret
int 49
ret
int 50
ret
int 51
ret
int 52
ret
int 53
ret
int 54
ret
int 55
ret
int 56
ret
int 57
ret
int 58
ret
int 59
ret
int 60
ret
int 61
ret
int 62
ret
int 63
ret
int 64
ret
int 65
ret
int 66
ret
int 67
ret
int 68
ret
int 69
ret
int 70
ret
int 71
ret
int 72
ret
int 73
ret
int 74
ret
int 75
ret
int 76
ret
int 77
ret
int 78
ret
int 79
ret
int 80
ret
int 81
ret
int 82
ret
int 83
ret
int 84
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?