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 + -
显示快捷键?