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