dllstart.asm

来自「开放源码的编译器open watcom 1.6.0版的源代码」· 汇编 代码 · 共 452 行 · 第 1/2 页

ASM
452
字号
;*****************************************************************************
;*
;*                            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:  CauseWay DLL 32-bit startup code.
;*
;*****************************************************************************

        name    dllstart

.387
.386p
        assume  nothing

        extrn   __CMain                 : near
        extrn   __InitRtns              : near
        extrn   __FiniRtns              : near
        extrn   "C",_heapwalk           : near
        extrn   "C",_heapshrink         : near
        extrn   "C",free                : near

        extrn   _edata                  : byte  ; end of DATA (start of BSS)
        extrn   _end                    : byte  ; end of BSS (start of STACK)

        extrn   "C",_dynend             : dword
        extrn   "C",_curbrk             : dword
        extrn   "C",_psp                : word
        extrn   "C",_osmajor            : byte
        extrn   "C",_osminor            : byte
        extrn   "C",_STACKLOW           : dword
        extrn   "C",_STACKTOP           : dword
        extrn   __no87                  : word
        extrn   "C",_Extender           : byte
        extrn   "C",_ExtenderSubtype    : byte
        extrn   "C",_Envptr             : dword
        extrn   "C",_Envseg             : word
        extrn   "C",__FPE_handler       : dword
        extrn   "C",_LpCmdLine          : dword
        extrn   "C",_LpPgmName          : dword
        extrn   "C",___Argc             : dword

DGROUP group _NULL,_AFTERNULL,CONST,_DATA,DATA,TIB,TI,TIE,XIB,XI,XIE,YIB,YI,YIE,_BSS,PRIVATE_STACK,STACK

DPMIGetSegmentBaseAddress   equ     6

X_RATIONAL                  equ     1
XS_RATIONAL_ZEROBASE        equ     0
XS_RATIONAL_NONZEROBASE     equ     1

HeapInfo struc
offs           dd 0
segm           dw 0
len            dd 0
flags          dd 0
HeapInfo ends

; this guarantees that no function pointer will equal NULL
; (WLINK will keep segment 'BEGTEXT' in front)
; This segment must be at least 4 bytes in size to avoid confusing the
; signal function.

BEGTEXT  segment use32 para public 'CODE'
        assume  cs:BEGTEXT
forever label   near
        int     3h
        jmp     short forever
___begtext label byte
        nop     ;3
        nop     ;4
        nop     ;5
        nop     ;6
        nop     ;7
        nop     ;8
        nop     ;9
        nop     ;A
        nop     ;B
        nop     ;C
        nop     ;D
        nop     ;E
        nop     ;F
        public ___begtext
        assume  cs:nothing
BEGTEXT  ends

_TEXT   segment use32 dword public 'CODE'

        assume  ds:DGROUP

_NULL   segment para public 'BEGDATA'
__nullarea label word
        db      01h,01h,01h,00h
        public  __nullarea
_NULL   ends

_AFTERNULL segment word public 'BEGDATA'
_AFTERNULL ends

CONST   segment word public 'DATA'
CONST   ends

TIB     segment byte public 'DATA'
TIB     ends
TI      segment byte public 'DATA'
TI      ends
TIE     segment byte public 'DATA'
TIE     ends

XIB     segment word public 'DATA'
XIB     ends
XI      segment word public 'DATA'
XI      ends
XIE     segment word public 'DATA'
XIE     ends

YIB     segment word public 'DATA'
YIB     ends
YI      segment word public 'DATA'
YI      ends
YIE     segment word public 'DATA'
YIE     ends


_DATA    segment dword public 'DATA'

        public  __D16Infoseg
        public  __x386_zero_base_selector

__D16Infoseg                dw  0020h   ; DOS/4G kernel segment
__x386_zero_base_selector   dw  0       ; base 0 selector for X-32VM

caller_stack    label   fword
caller_esp      dd      0
caller_ss       dw      0

HeapEntry    HeapInfo <>

_DATA    ends

DATA    segment word public 'DATA'
DATA    ends

_BSS          segment word public 'BSS'
_BSS          ends

STACK_SIZE      equ     1000h

; STACK segment can not be used in DLLs because linker sets stack length
; to zero for DLLs (as it should). Stack space for init/exit DLL routines
; is added to the end of BSS class

PRIVATE_STACK  segment word public 'BSS'
        db      (STACK_SIZE) dup(?)
_stack_top LABEL BYTE
PRIVATE_STACK  ends

STACK   segment para stack 'STACK'
STACK   ends


        assume  nothing
        public  __DLLstart_

        assume  cs:_TEXT

__DLLstart_ proc far
        jmp     short around

        align   4
        dd      ___begtext      ; make sure dead code elimination
                                ; doesn't kill BEGTEXT
;
; miscellaneous code-segment messages
;
ConsoleName     db      "con",00h

        assume  ds:DGROUP

around: mov     si,DGROUP               ; set DS to DGROUP
        mov     ds,esi                  ;
        mov     caller_esp,esp          ; save caller stack
        mov     caller_ss,ss            ;
        mov     ecx,ss
        mov     edx,esp
        mov     ss,esi                  ; set new stack
        mov     esp,offset _stack_top

        and     esp,0fffffffch          ; make sure stack is on a 4 byte bdry
        push    ecx
        push    ebx
        mov     ebx,esp                 ; get sp
        mov     _STACKTOP,ebx           ; set stack top
        mov     _curbrk,ebx             ; set first available memory location

        or      eax,eax                 ; check if init/exit DLL
        je      init_DLL

        mov     es,esi                  ; - call DLL exit code
        xor     ebp,ebp
        mov     ___Argc,1
        call    __CMain
        xor     eax,eax
        jmp     exit_code_eax

init_DLL:

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?