cstrt086.asm
来自「开放源码的编译器open watcom 1.6.0版的源代码」· 汇编 代码 · 共 538 行 · 第 1/2 页
ASM
538 行
;*****************************************************************************
;*
;* 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: DOS 16-bit startup code.
;*
;*****************************************************************************
; This must be assembled using one of the following commands:
; wasm cstrt086 -bt=DOS -ms -0r -D__TINY__
; wasm cstrt086 -bt=DOS -ms -0r
; wasm cstrt086 -bt=DOS -mm -0r
; wasm cstrt086 -bt=DOS -mc -0r
; wasm cstrt086 -bt=DOS -ml -0r
; wasm cstrt086 -bt=DOS -mh -0r
;
include mdef.inc
.286p
name cstart
assume nothing
if _MODEL and _BIG_CODE
extrn __CMain : far
extrn __InitRtns : far
extrn __FiniRtns : far
extrn __fatal_runtime_error_ : far
else
extrn __CMain : near
extrn __InitRtns : near
extrn __FiniRtns : near
extrn __fatal_runtime_error_ : near
endif
extrn _edata : byte ; end of DATA (start of BSS)
extrn _end : byte ; end of BSS (start of STACK)
extrn "C",_curbrk : word
extrn "C",_psp : word
extrn "C",_osmajor : byte
extrn "C",_osminor : byte
extrn __osmode : byte
extrn __HShift : byte
extrn "C",_STACKLOW : word
extrn "C",_STACKTOP : word
extrn "C",_cbyte : word
extrn "C",_child : word
extrn __no87 : word
extrn "C",__FPE_handler : dword
extrn "C",_LpCmdLine : word
extrn "C",_LpPgmName : word
extrn __get_ovl_stack : word
extrn __restore_ovl_stack : word
extrn __close_ovl_file : word
extrn __DOSseg__ : byte
ifdef __TINY__
extrn __stacksize : word
DGROUP group _TEXT,CONST,STRINGS,_DATA,DATA,XIB,XI,XIE,YIB,YI,YIE,_BSS
else
DGROUP group _NULL,_AFTERNULL,CONST,STRINGS,_DATA,DATA,XIB,XI,XIE,YIB,YI,YIE,_BSS,STACK
endif
ife _MODEL and _BIG_CODE
ifndef __TINY__
; 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.
; need a symbol defined here to prevent the dead code elimination from
; eliminating the segment.
; (the int 3h is useful for quickly revealing jumps to NULL code pointers)
BEGTEXT segment word public 'CODE'
assume cs:BEGTEXT
forever label near
int 3h
jmp short forever
___begtext label byte
nop
nop
nop
nop
public ___begtext
assume cs:nothing
BEGTEXT ends
endif
endif
_TEXT segment word public 'CODE'
ifndef __TINY__
FAR_DATA segment byte public 'FAR_DATA'
FAR_DATA ends
endif
assume ds:DGROUP
ifndef __TINY__
INIT_VAL equ 0101h
NUM_VAL equ 16
_NULL segment para public 'BEGDATA'
__nullarea label word
dw NUM_VAL dup(INIT_VAL)
public __nullarea
_NULL ends
_AFTERNULL segment word public 'BEGDATA'
dw 0 ; nullchar for string at address 0
_AFTERNULL ends
endif
CONST segment word public 'DATA'
CONST ends
STRINGS segment word public 'DATA'
STRINGS 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 word public 'DATA'
if _MODEL and _BIG_CODE
; Variables filled in by Microsoft Overlay Manager
; These are here for people who want to link with Microsoft Linker
; and use CodeView for debugging overlayed programs.
__ovlflag db 0 ; non-zero => program is overlayed
__intno db 0 ; interrupt number used by MS Overlay Manager
__ovlvec dd 0 ; saved contents of interrupt vector used
public __ovlflag
public __intno
public __ovlvec
endif
_DATA ends
DATA segment word public 'DATA'
DATA ends
_BSS segment word public 'BSS'
_BSS ends
ifndef __TINY__
STACK_SIZE equ 800h
STACK segment para stack 'STACK'
db (STACK_SIZE) dup(?)
STACK ends
endif
assume nothing
public _cstart_
public _Not_Enough_Memory_
assume cs:_TEXT
ifdef __TINY__
org 0100h
endif
_cstart_ proc near
jmp around
;
; copyright message
;
include msgrt16.inc
include msgcpyrt.inc
;
; miscellaneous code-segment messages
;
ifndef __TINY__
NullAssign db 0dh,0ah,'*** NULL assignment detected',0dh,0ah,0
endif
NoMemory db 'Not enough memory',0dh,0ah,0
ConsoleName db 'con',00h
ife _MODEL and _BIG_CODE
ifndef __TINY__
dw ___begtext ; make sure dead code elimination
endif ; doesn't kill BEGTEXT segment
endif
around: sti ; enable interrupts
ifdef __TINY__
mov cx,cs
else
mov cx,DGROUP ; get proper stack segment
endif
assume es:DGROUP
mov es,cx ; point to data segment
mov bx,offset DGROUP:_end ; get bottom of stack
add bx,0Fh ; ...
and bl,0F0h ; ...
mov es:_STACKLOW,bx ; ...
mov es:_psp,ds ; save segment address of PSP
ifdef __TINY__
mov ax,es:__stacksize ; get size of stack required
cmp ax,0800h ; make sure stack size is at least
jae ss_ok ; 2048 bytes
mov ax,0800h ; - set stack size to 2048 bytes
ss_ok: add bx,ax ; calc top address for stack
else
add bx,sp ; calculate top address for stack
endif
add bx,0Fh ; round up to paragraph boundary
and bl,0F0h ; ...
mov ss,cx ; set stack segment
mov sp,bx ; set sp relative to DGROUP
mov es:_STACKTOP,bx ; set stack top
mov dx,bx ; make sure enough memory for stack
shr dx,1 ; calc # of paragraphs needed
shr dx,1 ; ... for data segment
shr dx,1 ; ...
shr dx,1 ; ...
;
; check to see if running in protect-mode (Ergo 286 DPMI DOS-extender)
;
cmp byte ptr es:__osmode,0 ; if not protect-mode
jne mem_setup ; then it is real-mode
mov cx,ds:2h ; get highest segment address
mov ax,es ; point to data segment
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?